gpt4 book ai didi

swift - 如何在 GCD 中停止 DispatchWorkItem?

转载 作者:行者123 更新时间:2023-12-03 08:23:45 24 4
gpt4 key购买 nike

我目前正在玩大中央调度并发现了一个名为 DispatchWorkItem 的类.文档似乎有点不完整,所以我不确定是否以正确的方式使用它。我创建了以下代码段并期望有所不同。我预计该项目将在调用 cancel 后取消在上面。但由于某种原因,迭代仍在继续。任何想法我做错了什么?代码对我来说似乎很好。

@IBAction func testDispatchItems() {
let queue = DispatchQueue.global(attributes:.qosUserInitiated)
let item = DispatchWorkItem { [weak self] in
for i in 0...10000000 {
print(i)
self?.heavyWork()
}
}

queue.async(execute: item)
queue.after(walltime: .now() + 2) {
item.cancel()
}
}

最佳答案

GCD 不执行抢先取消。因此,要停止已经开始的工作项,您必须自己测试是否取消。在 Swift 中, cancel DispatchWorkItem .在 Objective-C 中,调用 dispatch_block_cancel 在您使用 dispatch_block_create 创建的 block 上.然后您可以使用 isCancelled 测试是否已取消。在 Swift 中(在 Objective-C 中称为 dispatch_block_testcancel )。

func testDispatchItems() {
let queue = DispatchQueue.global()

var item: DispatchWorkItem?

// create work item

item = DispatchWorkItem { [weak self] in
for i in 0 ... 10_000_000 {
if item?.isCancelled ?? true { break }
print(i)
self?.heavyWork()
}
item = nil // resolve strong reference cycle of the `DispatchWorkItem`
}

// start it

queue.async(execute: item!)

// after five seconds, stop it if it hasn't already

queue.asyncAfter(deadline: .now() + 5) {
item?.cancel()
item = nil
}
}

或者,在 Objective-C 中:
- (void)testDispatchItem {
dispatch_queue_t queue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0);

static dispatch_block_t block = nil; // either static or property

__weak typeof(self) weakSelf = self;

block = dispatch_block_create(0, ^{
for (long i = 0; i < 10000000; i++) {
if (dispatch_block_testcancel(block)) { break; }
NSLog(@"%ld", i);
[weakSelf heavyWork];
}

block = nil;
});

// start it

dispatch_async(queue, block);

// after five seconds, stop it if it hasn't already

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (block) { dispatch_block_cancel(block); }
});
}

关于swift - 如何在 GCD 中停止 DispatchWorkItem?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38370035/

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