异步从服务器下载信息

时间:2015-10-21 21:39:29

标签: swift asynchronous

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

因此我首先下载信息A然后下载信息B.由于两者都是异步方法,我想我需要等待completionHandler返回true,因此我知道数据已加载。这对于一种方法来说很容易。但是如何在button.contentEdgeInsets = UIEdgeInsetsMake(0,20,0,20); 的completionHandler返回true之前等待两个方法并因此触发添加注释?

getInformationFromServer

2 个答案:

答案 0 :(得分:1)

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

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组是一种阻止线程直到一个或多个任务的方法   完成执行。您可以在不能使用此行为的地方使用此行为   在所有指定任务完成之前取得进展。

答案 1 :(得分:0)

我可以为您推荐的另一种解决方案,它不像 dispatch_group_wait 那样“复杂”:

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

    getInformationFromServerA { [weak self] (downloadCompleted: Bool) -> Void in
        if downloadCompleted {
            self?.getInformationFromServerB({ (downloadCompleted: Bool) -> Void in
                completionHandler(completed: downloadCompleted)
            })
        }
        else {
            completionHandler(completed: downloadCompleted)
        }
    }
}