Проверка на множественные асинхронные ответы от Alamofire и Swift
Я пишу приложение, которое зависит от данных с различных сайтов / служб и включает в себя выполнение расчетов на основе данных из этих различных источников для создания конечного продукта.
Я написал пример класса с двумя функциями ниже, который собирает данные из двух источников. Я решил сделать функции разными, потому что иногда мы применяем разные методы аутентификации в зависимости от источника, но в этом примере я просто сократил их до простейшего вида. Обе функции используют Alamofire для запуска и обработки запросов.
Затем у меня есть функция инициализации, которая говорит, что если мы успешно собрали данные из обоих источников, затем загрузите другой файл пера, в противном случае подождите несколько секунд, если ответ не был получен, затем загрузите файл пера ошибки сервера.
Я постарался сделать этот пример максимально простым. По существу. Это та логика, которой я бы хотел следовать. К сожалению, похоже, в настоящее время это не работает
import Foundation
class GrabData{
var data_source_1:String?
var data_source_2:String?
init(){
// get data from source 1
get_data_1{ data_source_1 in
println("\(data_source_1)")
}
// get data from source 2
get_data_2{ data_source_1 in
println("\(data_source_1)")
}
var timer = 0;
while(timer<5){
if((data_source_1 == nil) && (data_source_2 == nil)){
// do nothing unless 4 seconds has elapsed
if (timer == 4){
// load server error nib
}
}else{
// load another nib, and start manipulating data
}
// sleep for 1 second
sleep(1)
timer = timer+1
}
}
func get_data_1(completionHandler: (String) -> ()) -> () {
if let datasource1 = self.data_source_1{
completionHandler(datasource1)
}else{
var url = "http://somewebsite.com"
Manager.sharedInstance.request(.GET, url).responseString {
(request, response, returnedstring, error) in
println("getting data from source 1")
let datasource1 = returnedstring
self.data_source_1 = datasource1
completionHandler(datasource1!)
}
}
}
func get_data_2(completionHandler: (String) -> ()) -> () {
if let datasource2 = self.data_source_2{
completionHandler(datasource2)
}else{
var url = "http://anotherwebsite.com"
Manager.sharedInstance.request(.GET, url).responseString {
(request, response, returnedstring, error) in
println("getting data from source 2")
let datasource2 = returnedstring
self.data_source_2 = datasource2
completionHandler(datasource2!)
}
}
}
}
Я знаю, что я мог бы поместить второе замыкание в первое внутри функции init, однако я не думаю, что это было бы наилучшей практикой, и я на самом деле использую более двух источников, поэтому замыкание будет n закрытием глубоко.
Любая помощь в поиске наилучшего способа проверки того, дал ли несколько источников данных правильный ответ, и правильная обработка этого, будут высоко оценены.