gpt4 book ai didi

ios - 串行队列/专用调度队列如何知道任务何时完成?

转载 作者:搜寻专家 更新时间:2023-10-30 21:51:01 25 4
gpt4 key购买 nike

(可能由 How does a serial dispatch queue guarantee resource protection? 回答,但我不明白是如何回答的)

问题

gcd 如何知道异步任务(例如网络任务)何时完成?为此,我应该使用 dispatch_retaindispatch_release 吗? 更新:我无法使用 ARC 调用这些方法中的任何一个...怎么办?

详情

我正在与进行大量网络访问的第 3 方库进行交互。我通过一个小类创建了一个包装器,它基本上提供了我需要的来自第 3 方类的所有方法,但是将调用包装在 dispatch_async(serialQueue) { () -> Void in 中(其中 serialQueue 是我的包装类的成员)。

我试图确保对底层库的每次调用都在下一次开始之前完成(不知何故尚未在库中实现)。

最佳答案

串行调度队列上的工作序列化是以直接提交给队列的工作单元为单位的。一旦执行到达提交闭包的末尾(或返回),就可以执行队列中的下一个工作单元。

重要的是,可能已经由闭包启动的任何其他异步任务可能仍在运行(或者甚至可能尚未开始运行),但不考虑它们。

例如,对于下面的代码:

dispatch_async(serialQueue) {
print("Start")
dispatch_async(backgroundQueue) {
functionThatTakes10Seconds()
print("10 seconds later")
}
print("Done 1st")
}

dispatch_async(serialQueue) {
print("Start")
dispatch_async(backgroundQueue) {
functionThatTakes10Seconds()
print("10 seconds later")
}
print("Done 2nd")
}

输出会是这样的:

Start

Done 1st

Start

Done 2nd

10 seconds later

10 seconds later

请注意,在分派(dispatch)第二个串行任务之前,第一个 10 秒任务尚未完成。现在,比较:

dispatch_async(serialQueue) {
print("Start")
dispatch_sync(backgroundQueue) {
functionThatTakes10Seconds()
print("10 seconds later")
}
print("Done 1st")
}

dispatch_async(serialQueue) {
print("Start")
dispatch_sync(backgroundQueue) {
functionThatTakes10Seconds()
print("10 seconds later")
}
print("Done 2nd")
}

输出会是这样的:

Start

10 seconds later

Done 1st

Start

10 seconds later

Done 2nd

请注意,这次因为 10 秒任务是同步调度的,串行队列被阻塞,第二个任务直到第一个任务完成后才开始。

在您的情况下,您正在包装的操作很有可能会自己分派(dispatch)异步任务(因为这是网络操作的本质),因此串行分派(dispatch)队列本身是不够的。

您可以使用 DispatchGroup 来阻塞您的串行调度队列。

dispatch_async(serialQueue) {
let dg = dispatch_group_create()
dispatch_group_enter(dg)
print("Start")
dispatch_async(backgroundQueue) {
functionThatTakes10Seconds()
print("10 seconds later")
dispatch_group_leave(dg)
}
dispatch_group_wait(dg)
print("Done")
}

这将输出

Start

10 seconds later

Done

dg.wait() 阻塞串行队列,直到 dg.leave 调用的次数与 dg.enter 调用的次数匹配.如果您使用此技术,则需要小心确保包装操作调用的所有可能完成路径 dg.leavedg.wait() 也有变体,它们带有超时参数。

关于ios - 串行队列/专用调度队列如何知道任务何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42145427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com