我想从我的服务器下载数据以显示在地图上。因此,我使用异步方法来获取数据。目标是显示一组注释对象。
因此我首先下载信息A然后下载信息B.由于两者都是异步方法,我想我需要等待completionHandler返回true,因此我知道数据已加载。这对于一种方法来说很容易。但是如何在button.contentEdgeInsets = UIEdgeInsetsMake(0,20,0,20);
的completionHandler返回true之前等待两个方法并因此触发添加注释?
getInformationFromServer
答案 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)
}
}
}