ios - Swift - async/await - 在 MainActor Task 的后台线程上执行异步方法

标签 ios swift async-await concurrency

这是我的 viewDidLoad 方法:

func viewDidLoad() {
    // Stuff here
    Task { @MainActor in 
        doSomeWorkOnMainThread1()
        doSomeWorkOnMainThread2()

        await doSomeBackgroundWork()

        doSomeWorkOnMainThread3()
        doSomeWorkOnMainThread4()
    }
}

这是我的方法,应该在后台线程上执行工作:

func doSomeBackgroundWork() async {
    // can add some code here
    // long image processing task
    assert(!Thread.isMainThread)
    // can add some code here
}

是否可以在后台线程(不使用 GCD)上执行 doSomeBackgroundWork,然后等待它返回主线程?

最佳答案

您正在寻找 Task.sleep。请注意,它以纳秒为单位,这真的很奇怪,所以我写了一个扩展来切换到秒;要得到它,你必须使用 Double,而不是 Int:

extension Task where Success == Never, Failure == Never {
    static func sleep(_ seconds:Double) async {
        await self.sleep(UInt64(seconds * 1_000_000_000))
    }
    static func sleepThrowing(_ seconds:Double) async throws {
        try await self.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
    }
}

保证一项工作将在后台线程上完成的方法是将该工作交给 Actor。这就是 Actor 的用途(部分)。

例如,如果一个 Actor 有一个调用 Task.sleep 的方法 doSleep,那么如果您实例化该 actor 并从您的任务中调用该方法,它就会休眠在后台线程上。

关于ios - Swift - async/await - 在 MainActor Task 的后台线程上执行异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70758761/

相关文章:

ios - 当Int溢出导致IOS app crash时,如何remark

ios - FirebaseAuthUI IOS - 如何添加登录屏幕背景图片?

swift - 使用 Realm 和 Swift 的 UITableView 具有按字母顺序排列的多个部分,多个标签与相同的数据连接

Swift - 视觉约束不起作用

C# 挂起线程直到服务器响应

ios - Swift - 如何以编程方式旋转 UITableViewHeader 中的 UIImageView

ios - Crashlytics 在 iOS 键盘扩展中不起作用

ios - 在 Swift 3 中更改 UIBarButtonItem(图像)的大小

c# - 异步/等待未按预期使用react

c# - Xamarin 中的 Task.ConfigureAwait(false) - 使用安全/推荐使用?