0

J'ai deux fonctions: func Females_NonChat() et func males_NonChat() Je veux attendre que deux d'entre eux pour terminer avant d'exécuter l'instruction d'impression dans viewDidLoad. Ai-je besoin d'un autre gestionnaire de complétion pour accomplir cela?attendre deux fonctions d'achèvement asynchrones pour terminer, avant d'exécuter le code suivant la ligne

Les fonctions utilisées sont des gestionnaires d'achèvement Firebase pour demander des informations à la base de données en ligne ...

override func viewDidLoad() { 
    super.viewDidLoad() 
    func Females_NonChat() 
    func males_NonChat() 

    print("finished executing both asynchronous functions") 
} 

func Females_NonChat(){ 
    Anon_Ref.child("Chatting").child("female").observeSingleEventOfType(.Value, withBlock: {(snapshot) in 
     if let FemInChatting = snapshot.value as? [String : String] { 
      print("executing") 
     } 
    }) 
} 

func males_NonChat(){ 
    Anon_Ref.child("Chatting").child("male").observeSingleEventOfType(.Value, withBlock: {(snapshot) in 
     print("executing") 
    }) 
} 
+4

Que diable est 'func Females_NonChat(); func males_NonChat() 'dans votre' viewDidLoad'? Ce n'est même pas légal Swift. Fournir le code que _compiles_ (si vous le pouvez). – matt

+0

Je dirais que c'est un doublon total de http://stackoverflow.com/questions/11909629/waiting-until-two-async-blocks-are-executed-before-starting-another-block?rq=1, qui apparaît en premier dans la liste associée. Avez-vous même essayé de chercher avant de demander? – matt

+0

@matt dans la mesure où je sais que nous pouvons utiliser des fonctions imbriquées dans Swift, donc la fonction peut contenir une autre fonction à l'intérieur, non? –

Répondre

3

En général, vous devriez utiliser un groupe d'expédition, entrez le groupe avant chaque méthode asynchrone, quitter le groupe à la fin de chaque méthode asynchrone, puis mettre en place une notification de groupe lorsque tous les appels « enter » sont mis en correspondance par « congé » correspondant appelle:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let group = dispatch_group_create() 

    dispatch_group_enter(group) 
    Females_NonChat() { 
     dispatch_group_leave(group) 
    } 

    dispatch_group_enter(group) 
    males_NonChat() { 
     dispatch_group_leave(group) 
    } 

    dispatch_group_notify(group, dispatch_get_main_queue()) { 
     print("finished executing both asynchronous functions") 
    } 
} 

func Females_NonChat(completionHandler:() ->()) { 
    Anon_Ref.child("Chatting").child("female").observeSingleEventOfType(.Value) { snapshot in 
     if let FemInChatting = snapshot.value as? [String : String] { 
      print("executing") 
     } 
     completionHandler() 
    } 
} 

func males_NonChat(completionHandler:() ->()) { 
    Anon_Ref.child("Chatting").child("male").observeSingleEventOfType(.Value) { snapshot in 
     print("executing") 
     completionHandler() 
    } 
} 
+0

J'essaye ceci, mais pour une raison quelconque mes fonctions ne sont pas appelées. dois-je les appeler quelque part, aussi? –

+0

a trouvé le problème. le problème était, que dans votre code vous créez les fonctions avec le block dispatch_group_enter –

+0

vous dites 'func males_NonChat()' mais il devrait être 'males_NonChat()' –