如何检查两个异步任务是否成功完成

如何检查两个异步任务是否成功完成

问题描述:

在函数中实现此流程图的最佳和最简单的方法是什么? 现在我正在使用两个派遣组,但我需要检查他们是否都完成了,而不仅仅是当他们完成时。如何检查两个异步任务是否成功完成

如果他们这样做,那么:

  • 朋友阵列将拥有元素
  • 昵称阵列将拥有元素

Flowchart

注:FB是Facebook和FIR是火力地堡数据库

+0

也许你可以尝试在GCD中的dispatch_barrier_async或dispatch_group。 – Coollee

你可以使用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

因此,如果我然后说,当索引== 0时,我执行Facebook,并且当索引== 1时,我执行Firebase? 从你给出的例子来看,我不需要随机的,对吗? –

+0

不,这个想法是说明在开始每个异步任务时将其添加到组中,并在完成时离开。随机的要点是引入不同的执行时间,并显示只有在所有异步任务都离开组后才会调用通知 –

+0

谢谢。您的答案不仅解决了我的问题,而且还清理了我的代码! –

输出东西,你可以实现斯威夫特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 
} 

} 

} 

fetchFBfriendsfetchFIRNickNames是负责获得来自Facebook和火力地堡数据的功能。