2016-03-02 6 views
-1

У меня есть запрос asynchronus в классе, как это,Как вызвать функцию завершения запроса asynchronus - Swift 2,0

class Req{ 
    func processRequest(){ 
     NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
      //Do some operation here 
     }) 
    } 
} 

И я называю этот метод из одного контроллера представления, как это,

class classOne{ 
    func classOneFun(){ 
     Req().processRequest() 
     self.demoFun() 
    } 

    func demoFun(){ 
     //Do some operation here 
    } 
} 

И я зову ту же функцию от другого контроллера представления, как это,

class classTwo{ 

    func classTwoFun(){ 
     Req().processRequest() 
     self.sampleFun() 
    } 

    func sampleFun(){ 
     //Do some operation here 
    } 
} 

Теперь я хочу позвонить demoFun() или sampleFun() только после завершения processRequest(). Если demoFun() or sampleFun() и processRequest() находятся в одном классе, то я могу вызвать функции в обработчике завершения processRequest(). Но в моем случае я не могу этого сделать, поскольку у меня есть почти 20 контроллеров представлений, которые вызывают функцию processRequest(). Я не могу использовать SynchronusRequest, поскольку он устарел в Swift 2.0. Итак, как я могу вызвать другие функции после завершения асинхронного запроса?

ответ

0

Вам нужно будет изменить функцию processRequest, чтобы получить закрытие. Например:

class Req{ 

     func processRequest(callback: Void ->Void){ 
      NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
       //Do some operation here 
       //Call the callback here: 
       callback() 
      }) 
     } 
    } 

Теперь везде, где вы хотите, чтобы вызвать API ProcessRequest, вы можете добавить код, который вы хотите выполнить вскоре после асинхронной обработки обратного вызова. Например:

class classOne{ 
    func classOneFun(){ 
     Req().processRequest(){ //Passing the closure as a trailing closure with the code that we want to execute after asynchronous processing in processRequest 
     self.demoFun() 

} 
    } 

    func demoFun(){ 
     //Do some operation here 
    } 
} 

HTH.

+0

Спасибо за ваш ответ. Я не использовал 'callback', и я не знаю, что это такое. Могу ли я узнать, как это работает? –

+0

Или, если у вас есть какие-либо учебники по этому вопросу, можете ли вы поделиться этим здесь? –

+1

callback - это имя параметра. Замените callBack на «shutThatIsGoingToBeCalledWhenTheRequestSucceeds» и посмотрите, имеет ли смысл. – gnasher729

3

Создание блоков

class Req{ 
    func processRequest(success:() ->()){ 
     NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
      //Do some operation here 
      success() 
     }) 
    } 
} 


class classOne{ 
    func classOneFun(){ 
     Req().processRequest {() ->() in 
      self.demoFun() 
     } 
    } 

    func demoFun(){ 
     //Do some operation here 
    } 
} 
+0

Спасибо за ваш ответ. Если я смогу получить несколько руководств по функциям закрытия или обратного вызова, тогда мне было бы полезно. –

+0

вы можете посмотреть официальный документ здесь: https://developer.apple.com/library/ios/documentation/Swift/ Концептуальный/Swift_Programming_Language/Closures.html –

+1

читайте это http://fuckingswiftblocksyntax.com, если у вас недостаточно времени: - \ –

 Смежные вопросы

  • Нет связанных вопросов^_^