-1

Je viens d'un arrière-plan C# et voudrais mettre en œuvre en attente de fonctionnalité dans mon application Swift. J'ai atteint les résultats souhaités, mais j'ai dû utiliser un sémaphore dont je ne suis pas sûr que ce soit une bonne pratique. J'ai une fonction avec une requête alamo qui retourne un JSON avec une valeur de succès et si je comprends bien, cette fonction de requête est asynchrone avec un gestionnaire d'achèvement. Le gestionnaire se déclenche une fois la requête terminée. Le problème renvoie la valeur de succès de cette opération. Voici un exemple de code psuedo ce que je fais:"attendre" les résultats des tâches dans Swift

func AlamoTest() -> Bool{ 
var success = false 
//Do some things... 
//... 
//Signal from async code 
let semaphore = DispatchSemaphore(value: 0) 
Alamofire.request("blah blah blah", method: .post, parameters: parameters, encoding: URLEncoding.default).responseJSON { response in { 
    success = response["success"] 
    if(success){ 
     //Do some more things 
    } 
    semaphore.signal() //Signal async code is done 
} 
//Wait until async code done to get result 
semaphore.wait(timeout: DispatchTime.distantFuture) 
return success 
} 

Y at-il une « meilleure » façon d'atteindre mon objectif? Je suis nouveau à Swift et ses constructions asynchrones.

+0

Un vote négatif? Sérieusement? – Seapoe

Répondre

0

La meilleure solution que j'ai trouvée est ce que j'appelle "callback chaining". Exemple de ma méthode ressemble à ceci:

func postJSON(json: NSDictionary, function: ServerFunction, completionHandler: ((_ jsonResponse: NSDictionary) -> Void)? = nil) { 
    //Create json payload from dictionary object 
    guard let payload = serializeJSON(json: json) else { 
     print("Error creating json from json parameter") 
     return 
    } 

    //Send request 
    Alamofire.request(urlTemplate(function.rawValue), method: .post, parameters: payload, encoding: URLEncoding.default).validate().responseJSON { response in 
     //Check response from server 
     switch response.result { 
      case .success(let data): 
       let jsonResponse = data as! NSDictionary 
       print("\(jsonResponse)") 
       //Execute callback post request handler 
       if completionHandler != nil { 
        completionHandler!(jsonResponse) 
       } 
      case .failure(let error): 
        print("Shit didn't work!\(error)") 
      } 
    } 
} 

Le dernier paramètre est une fermeture qui exécute une fois l'opération terminée async orginal. Vous passez le résultat à la fermeture et faites ce que vous voulez avec. Dans mon cas, je voulais désactiver la vue pendant que les opérations asynchrones tournaient. Vous pouvez activer la vue dans votre argument closure puisque le résultat de l'opération async alamo est appelé sur le thread principal. completionHandler est nul par défaut si vous n'avez pas besoin du résultat et arrête le chaînage.

+0

https://medium.com/ios-os-x-development/managing-async-code-in-swift-d7be44cae89f –