gpt4 book ai didi

ios - 调用 .cancel() 时 DispatchWorkItem 不终止函数

转载 作者:搜寻专家 更新时间:2023-10-31 22:09:37 25 4
gpt4 key购买 nike

我在主函数 runTask() 中调用的函数列表中使用 Alamofire 按顺序发出了一系列 HTTP 请求,我希望能够停止这些请求。因此,我为每个需要运行的任务在 DispatchWorkItem 中设置了 runTask() 函数调用,并将工作项存储在数组中,如下所示:

taskWorkItems.append(DispatchWorkItem { [weak self] in
concurrentQueue!.async {
runTask(task: task)
}
})

然后,我迭代工作项数组并调用 perform() 函数,如下所示:

for workItem in taskWorkItems {
workItem.perform()
}

最后,我的应用程序中有一个按钮,我想在点击时取消工作项,我有以下代码来实现这一点:

for workItem in taskWorkItems {
concurrentQueue!.async {
workItem.cancel()

print(workItem.isCancelled)
}
}

workItem.isCancelled 打印为 true;但是,我在 runTask() 调用的函数中设置了日志,即使调用了 workItem.cancel() 并且 workItem,我仍然看到执行的函数.isCancelled 打印 true。我做错了什么以及如何停止执行我的函数?

最佳答案

TLDR:调用 cancel 将停止执行尚未运行的任务,但不会停止已在执行的任务。

因为关于这个的 apple 文档是陈旧的......

https://medium.com/@yostane/swift-sweet-bits-the-dispatch-framework-ios-10-e34451d59a86

调度工作项有一个取消标志。如果它在运行前被取消,调度队列将不会执行它并跳过它。如果它在执行期间被取消,则取消属性返回 True。在这种情况下,我们可以中止执行

//create the dispatch work item
var dwi2:DispatchWorkItem?
dwi2 = DispatchWorkItem {
for i in 1...5 {
print("\(dwi2?.isCancelled)")
if (dwi2?.isCancelled)!{
break
}
sleep(1)
print("DispatchWorkItem 2: \(i)")
}
}
//submit the work item to the default global queue
DispatchQueue.global().async(execute: dwi2!)

//cancelling the task after 3 seconds
DispatchQueue.global().async{
sleep(3)
dwi2?.cancel()
}

关于ios - 调用 .cancel() 时 DispatchWorkItem 不终止函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52635193/

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