2016-03-02 5 views
-1

J'ai une demande de asynchronus dans une classe comme ça,Comment appeler une fonction à l'issue d'une demande de 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 
     }) 
    } 
} 

Et j'appelle cette méthode d'un contrôleur de vue comme celui-ci,

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

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

Et j'appelle la même fonction d'un autre contrôleur de vue comme celui-ci,

class classTwo{ 

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

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

Maintenant, je veux appeler le demoFun() ou sampleFun() seulement après le processRequest() est terminée. Si demoFun() or sampleFun() et processRequest() sont dans la même classe, alors je peux appeler les fonctions dans le gestionnaire de complétion de processRequest(). Mais, dans mon cas, je ne peux pas faire cela, puisque j'ai près de 20 contrôleurs de vue qui appellent la fonction processRequest(). Je ne peux pas utiliser SynchronusRequest car il est obsolète dans Swift 2.0. Alors, comment puis-je appeler les autres fonctions une fois la requête asynchronus terminée?

Répondre

0

Vous devrez modifier votre fonction processRequest pour recevoir une fermeture. Par exemple:

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() 
      }) 
     } 
    } 

Maintenant chaque fois que vous voulez appeler l'API processRequest, vous pouvez ajouter le code que vous voulez exécuter rapidement après votre traitement de rappel asynchrone. Par exemple:

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

Merci pour votre réponse. Je n'ai pas utilisé 'callback' et je ne sais pas ce que c'est. Puis-je savoir comment cela fonctionne? –

+0

Ou si vous avez des tutoriels sur ce sujet, pouvez-vous partager ici? –

+1

callback est le nom d'un paramètre. Remplacez callBack par "closureThatIsGoingToBeCalledWhenTheRequestSucceeds" et voyez si cela a plus de sens. – gnasher729

3

Créer des blocs

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

Merci pour votre réponse. Si je peux obtenir quelques tutoriels sur les fonctions de fermeture ou de rappel, alors il me serait utile .. –

+0

vous pouvez regarder le document officiel ici: https://developer.apple.com/library/ios/documentation/Swift/ Conceptuel/Swift_Programming_Language/Closures.html –

+1

lisez ceci http://fuckingswiftblocksyntax.com si vous n'avez pas assez de temps: - \ –