在函数中实现此流程图的最佳和最简单的方法是什么? 现在我正在使用两个派遣组,但我需要检查他们是否都完成了,而不仅仅是当他们完成时。如何检查两个异步任务是否成功完成
如果他们这样做,那么:
- 朋友阵列将拥有元素
- 昵称阵列将拥有元素
注:FB是Facebook和FIR是火力地堡数据库
在函数中实现此流程图的最佳和最简单的方法是什么? 现在我正在使用两个派遣组,但我需要检查他们是否都完成了,而不仅仅是当他们完成时。如何检查两个异步任务是否成功完成
如果他们这样做,那么:
注:FB是Facebook和FIR是火力地堡数据库
你可以使用DispatchGroup
。尝试下面的操场;
import UIKit import XCPlayground let dispatchGroup = DispatchGroup.init() for index in 0...4 { dispatchGroup.enter() let random = drand48() let deadline = DispatchTime.now() + random/1000 print("entered \(index)") DispatchQueue.global(qos: .background).asyncAfter(deadline: deadline, execute: { print("leaving \(index)") dispatchGroup.leave() }) } dispatchGroup.notify(queue: .global()) { print("finished all") }
应该类似于
entered 0 leaving 0 entered 1 entered 2 leaving 1 leaving 2 entered 3 leaving 3 entered 4 leaving 4 finished all
因此,如果我然后说,当索引== 0时,我执行Facebook,并且当索引== 1时,我执行Firebase? 从你给出的例子来看,我不需要随机的,对吗? –
不,这个想法是说明在开始每个异步任务时将其添加到组中,并在完成时离开。随机的要点是引入不同的执行时间,并显示只有在所有异步任务都离开组后才会调用通知 –
谢谢。您的答案不仅解决了我的问题,而且还清理了我的代码! –
输出东西,你可以实现斯威夫特3一样,这个流程图。
let fbFriendsArray : [String] = []
let firNickNames :: [String] = []
func flowChart() {
let myGroupOuter = DispatchGroup()
myGroupOuter.enter()
fetchFBfriends(completionHandler: {(isSuccess : Bool) in
myGroupOuter.leave()
})
myGroupOuter.enter()
fetchFIRNickNames(completionHandler: {(isSuccess : Bool) in
myGroupOuter.leave()
})
myGroupOuter.notify(queue: DispatchQueue.main) {
if (fbFriendsArray.isEmpty || firNickNames.isEmpty) {
/// Present Your Error Logic
} else {
/// Fetch Games Logic here
}
}
}
fetchFBfriends
和fetchFIRNickNames
是负责获得来自Facebook和火力地堡数据的功能。
也许你可以尝试在GCD中的dispatch_barrier_async或dispatch_group。 – Coollee