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

问题描述 投票:0回答:3

在函数中实现此流程图的最佳和最简单方法是什么? 现在我正在使用两个调度组,但我需要检查它们是否都已完成,而不仅仅是它们完成时。

如果他们完成了那么:

  • friends 数组将有元素
  • 昵称数组将包含元素

注:FB是Facebook,FIR是Firebase数据库

swift swift3
3个回答
2
投票

您可以使用

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")
}

应该输出类似于

的东西
输入 0
留下 0
输入 1
输入 2
离开 1
离开 2
输入 3
离开 3
输入 4
离开 4
全部完成

2
投票

Swift 5 + 异步等待

假设你想同时加载 3 张图片,并等待它们被下载到屏幕上。

Task {
    do {
        // Call first function and proceed to next step
        async let image_1 = try firstAsyncMethod()
        
        // Call second function and proceed to next step
        async let image_2 = try secondAsyncMethod()
        
        // Call function and proceed to next step
        async let image_3 = try thirdAsyncMethod()
        
        let images = try await [image_1, image_2, image_3]
        // Display images
        
    } catch {
        // Handle Error
    }
}

0
投票

你可以像那样在 Swift 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 和 Firebase 获取数据的函数。

© www.soinside.com 2019 - 2024. All rights reserved.