2016-12-03 6 views
2

В приложении чата, над которым я работаю, мне нужно отправить телефонные номера, полученные из контактов в API, и получить номера, которые уже зарегистрированы в приложении.Вызвать замыкание рекурсивно

Поскольку списки контактов могут быть очень длинными, я планирую отправлять номера телефонов в партиях (по запросу). И обновите пользовательский интерфейс в соответствии с каждым возвращенным ответом.

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

Я хочу отправить каждую партию один за другим. Другими словами, вот как я хочу, чтобы процесс прошел.

Отправить партию -> получить ответ -> обновить пользовательский интерфейс (если есть зарегистрированные пользователи) -> Отправить следующую партию -> ...

Но с getRegisteredContacts быть замыканием, петля for просто отправляет все запросы один за другим, не дожидаясь завершения предыдущего запроса.

Как я могу заставить его ждать и запускать каждый последующий запрос после завершения предыдущего запроса?

+2

Синхронные редко бывает хорошая идея. Вы должны посмотреть на NSOperationQueue. – Paulw11

ответ

0

Если я его правильно, вы хотите что-то вроде этого:

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) 
    } 
} 
Смежные вопросы