2016-04-25 4 views
0

Моя цель состоит в том, чтобы иметь ряд функций, которые выполняются один за другим.хранить массив функций с закрытием

static func GetData(success:(() ->())?, failure:((response : NSURLResponse, error : NSError) ->())?){ 
     //do something asynchronous. make web service call 

     success?() 
     //or 
     failure?(response: urlResponse, error: errorThrown) 
} 

А затем в контроллере вида я пытаюсь сохранить функции, подобные описанным выше в массиве. Моя цель - перебрать этот массив и выполнить функции один за другим. Причина этого в том, что каждая функция зависит от данных, которые возвращаются из предыдущей функции.

Так что я сделал перечисление

enum MyEnum { 
    case GetData() 
    case GetData2()...and so on 
    //and every other function is put here 
} 

Теперь на мой взгляд, контроллер, я добавляю это в массив

funcs.append(MyEnum.GetData(DataAccess.GetData({ 
     //do stuff 

     }, failure: { (response, error) in 

    }))) 

funcs.append(MyEnum.GetData2(DataAccess.GetData2({ 
      //do stuff 

      }, failure: { (response, error) in 

     }))) 

Однако всякий раз, когда я храню функцию, она автоматически выполняет. Думаю, я мог бы это сделать, если бы не было закрытий, но мне нужно, чтобы они определили, как действовать.

Есть ли лучший способ сделать это? Я что-то упускаю?

Сохранение массива функций с затворами автоматически выполняет их

var arrayOfFuncs = [ 
     DataAccess.GetData1({ 
      print("success") 
      }, failure: { (response, error) in 
       print("failure") 
     }), 

     DataAccess.GetData2({ 
      print("ok") 
      }, failure: { (response, error) in 
       print("ee") 
     }) 
    ] 
+0

В чем смысл создания перечисления? Будет ли проще, если вы просто поместите функции в массив? –

+1

Я ссылался на этот вопрос http://stackoverflow.com/questions/24418951/array-of-functions-in-swift – prawn

+0

Ребята использовали перечисление в этом вопросе, потому что подписи функций были разными. У вас, как я вижу, есть те же подписи, поэтому вы можете хранить их в массиве напрямую. –

ответ

1

GetData занимает 2 затворов в качестве параметров, это не две крышки. Я не понимаю, что вы делаете с перечислением.

typealias Block =() -> Void 
typealias Error = (NSURLResponse,NSError) -> Void 

var funcs = [(Block,Error)] 

func.forEach{ f => f._0() } // call success() 


// Or you could do this 
typealias Getter = (Block,Error) -> Void 
var funcs2 = [Getter] 
funcs2.append(DataAccess.GetData) 
Смежные вопросы