- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在玩大中央调度并发现了一个名为 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
}
}
- (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/
我有一组 dispatch workItems,如何等到一个工作完成后再继续队列中的下一个工作? func AsyncCalls(statusHandler: @escaping (String) -
注意:这不是我已经看到的重复问题 Dispatch group - cannot notify to main thread 关于 DispatchWorkItem 没有任何答案 我有如下代码 let
我想在超时或满足某些特定条件后执行特定功能。我已经使用DispatchWorkItem快速完成了相同的工作并使用了 dispatchQueue?.asyncAfter(deadline: .now()
背景 我正在实现搜索。每个搜索查询都会产生一个 DispatchWorkItem,然后排队等待执行。由于用户触发新搜索的速度比完成前一个搜索的速度快,因此我想在收到新搜索后立即取消前一个搜索。 这是我
我目前正在玩大中央调度并发现了一个名为 DispatchWorkItem 的类.文档似乎有点不完整,所以我不确定是否以正确的方式使用它。我创建了以下代码段并期望有所不同。我预计该项目将在调用 canc
我目前正在使用Grand Central Dispatch并发现了一个名为DispatchWorkItem的类。该文档似乎有点不完整,所以我不确定如何正确使用它。我创建了以下代码片段并期待一些不同的东
我想要实现的目标: 我正在尝试执行两个不同的任务,具体取决于用户是在 touchesBegan 方法中点击屏幕一次还是两次。 在这样做的过程中,我将 singleTapTask 的执行延迟 0.3 秒
我刚刚开始用 Swift 编程语言学习更多关于 Grand Central Dispatch 的知识。 我按照在线教程更好地理解 GCD 并尝试了各种用法示例... 在有关工作项的部分中,我编写了以下
我有几个要在队列上执行的 Dispatch 工作项 我不想重新声明代码,我想将它们传递给 DispatchWorkItems 的数组或列表,然后将其注入(inject)调度queue 有什么办法可以实
在 XCode 8.3 上使用 Swift 3.1,使用 Thread Sanitizer 运行以下代码会发现数据竞争(请参阅代码中的写入和读取注释): private func incremen
我在主函数 runTask() 中调用的函数列表中使用 Alamofire 按顺序发出了一系列 HTTP 请求,我希望能够停止这些请求。因此,我为每个需要运行的任务在 DispatchWorkItem
给定以下代码 @IBAction func buttonClick(_ sender: Any) { recordLabel.text = "Perform some time consumi
为什么这段代码会这样执行?请注意测试代码中指示哪些行通过和失败的注释。 更具体地说,RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.01
我是一名优秀的程序员,十分优秀!