2016-12-03 2 views
2

In einer Chat-App, an der ich gerade arbeite, muss ich die Telefonnummern aus den Kontakten an eine API senden und die Nummern abrufen, die sich bereits bei der App registriert haben.Eine Schließung rekursiv aufrufen

Da Kontaktlisten sehr lang sein können, plane ich, die Telefonnummern in Chargen zu senden (20 pro Anfrage). Und aktualisieren Sie die Benutzeroberfläche entsprechend jeder zurückgegebenen Antwort.

private(set) var registeredContacts: [RegContact] = [] 

let phoneNumbersInBatches: [[String]] = [[]] 

for batch in phoneNumbersInBatches { 
    ApiClient.sharedInstance.getRegisteredContacts(from: batch) { contacts, error in 
     // Saving to database 
     // Update the UI 
     // ... 

     self.registeredContacts += contacts 
    } 
} 

Ich mag jede Partie nacheinander senden. Mit anderen Worten, hier ist, wie ich den Prozess gehen möchte.

Senden Batch -> erhalten Antwort -> Aktualisieren der UI (wenn Benutzer registriert sind) -> nächste Charge senden -> ...

Aber mit getRegisteredContacts ist ein Verschluss, der for Schleife sendet einfach alle Anfragen nacheinander aus, ohne auf den Abschluss der vorherigen Anfrage zu warten.

Wie kann ich jede weitere Anfrage warten und absetzen, nachdem die vorherige Anfrage abgeschlossen wurde?

+2

Synchron ist selten eine gute Idee. Sie sollten sich NSOperationQueue ansehen. – Paulw11

Antwort

0

Wenn ich es richtig bekam, wollen Sie etwas wie folgt aus:

sendNumbers(allNumbers) 

func sendNumbers(_ numbers:[], fromOffset offset: Int = 0) { 
    ApiClient.sharedInstance.getRegisteredContacts(from: batch) { contacts, error in 
     // Saving to database 
     // Update the UI 
     // ... 

     self.registeredContacts += contacts 
     offset += myValueForExample20 
     sendNumbers(numbers, fromOffset: offset) 
    } 
} 
Verwandte Themen