swift 如何恢复continuation,确保结果在MainActor上交付?

dnph8jn4  于 2023-05-16  发布在  Swift
关注(0)|答案(2)|浏览(115)

我有一个延续:

func a() async -> Int {
    await withCheckedContinuation { continuation in
        continuation.resume(returning: 3)
    }
}

我希望此函数的所有调用者都能在MainActor上接收结果。我不希望调用者必须明确指定此重新安排。我不想这样

func c() async {
    let three = await a()
    await MainActor.run {
        b(three)
    }
}

相反,我希望返回后的整个代码在MainThread上执行,直到下一个挂起点,类似于这样:

func c1() async {
    let three = await a()

    b(three) // Guaranteed main thread, although nothing speaks of it here
}

在某种程度上,我希望a声明I return only on main actor!,如下所示:

func a() @MainActor async -> Int {
    await withCheckedContinuation { continuation in
        continuation.resume(returning: 3)
    }
}

有什么办法能做到这一点吗?

**更新:**两位评论者都建议我用@MainActor注解封闭函数cc1

@MainActor
func c() async {
    let three = await a()
    await MainActor.run {
       b(three)
    }
}

这不像我需要的那样。它说:

  • 每次我等待某人,他们必须返回主线程

但我需要的是这个

  • 每次有人等我的时候,他们必须在主线程上得到我的结果
ql3eal8s

ql3eal8s1#

应该可以这样:

func a() async -> Int {
    await withCheckedContinuation { continuation in
        Task {@MainActor in
            continuation.resume(returning: 3)
        }
    }
}
pxy2qtax

pxy2qtax2#

不,没有办法做到这一点。
如果你等待某个函数,你可以决定它将在哪个线程上返回。但是作为一个等待的函数,您不能确保您的结果将被传递给特定线程和/或主线程上的调用者。

相关问题