Проверка на множественные асинхронные ответы от 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 закрытием глубоко.

Любая помощь в поиске наилучшего способа проверки того, дал ли несколько источников данных правильный ответ, и правильная обработка этого, будут высоко оценены.

Ответы на вопрос(1)

Ваш ответ на вопрос