swift - 从服务器异步下载信息

标签 swift asynchronous

我想从我的服务器下载数据以显示在 map 上。因此我使用异步方法来获取数据。目标是显示一组注释对象。

因此我首先下载信息A,然后下载信息B。由于两者都是异步方法,我想我需要等待completionHandler返回true,以便我知道数据已加载。这对于一种方法来说很容易。但是,在 getInformationFromServer 的completionHandler 返回 true 并触发添加注释之前,我该如何处理等待这两个方法呢?

override func viewWillAppear(animated: Bool) {
    self.customizeInterface()
    self.getInformationFromServer { (completed) -> Void in
        if(completed) {
            self.mapView.addAnnotations(self.annotationArray)
        }
    }        
}

func getInformationFromServer(completionHandler: (completed: Bool) -> Void) {

    getInformationFromServerA { (downloadCompleted) -> Void in
        completionHandler(completed: downloadCompleted)
    }

// HOW DO I MANAGE TO ONLY RETURN THE COMPLETION HANDLER TRUE WHEN
// BOTH FUNCTIONS RETURNED TRUE? 

}

func getInformationFromServerA(completionHandler: (downloadCompleted: Bool) -> Void) {
    Server().getJsonInformationFromServer(url: "aeds", completionHandler: { (response) -> Void in
        self.parseAEDInformationToAnnotation(response["data"])
        completionHandler(downloadCompleted: true)
    })
}

func getInformationFromServerB(completionHandler: (downloadCompleted: Bool) -> Void) {
    Server().getJsonInformationFromServer(url: "aeds", completionHandler: { (response) -> Void in
        self.parseAEDInformationToAnnotation(response["data"])
        completionHandler(downloadCompleted: true)
    })
}

最佳答案

您可以使用调度组等待两个下载完成。

func getInformationFromServer(completionHandler: (completed: Bool) -> Void) {
    let dispatchGroup = dispatch_group_create()

    var downloadCompletedA: Bool = false
    dispatch_group_enter(dispatchGroup)
    getInformationFromServerA { (downloadCompleted) -> Void in
        downloadCompletedA = downloadCompleted
        dispatch_group_leave(dispatchGroup)
    }

    var downloadCompletedB: Bool = false
    dispatch_group_enter(dispatchGroup)
    getInformationFromServerB { (downloadCompleted) -> Void in
        downloadCompletedB = downloadCompleted
        dispatch_group_leave(dispatchGroup)
    }

    // wait until both downloads are finished
    dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER)

    completionHandler(downloadCompletedA && downloadCompletedB)
}

请参阅 Apple 的 Concurrency Programming Guide :

Dispatch groups are a way to block a thread until one or more tasks finish executing. You can use this behavior in places where you cannot make progress until all of the specified tasks are complete.

关于swift - 从服务器异步下载信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33269748/

相关文章:

javascript - ExtJs:ajax 调用中的代码执行顺序是什么?

swift - 以编程方式添加时默认缺少自动布局约束

swift - Alamofire JSON .GET 编码到数组

ios - 从后台线程返回函数

c# - 异步 TDD - 测试类 block

javascript - 在等待 promise 完成时无法在 Vue.js 中获取 DOM 更新

javascript - console.log 的非 volatile 替代品

c# - 异步任务如何有条件返回

swift - [[Element].Element] 在 Swift 的 == 运算符重载中意味着什么?

ios - 如何删除数组中重复的对象?