gpt4 book ai didi

objective-c - 在 iOS 的 dispatch_async 队列中杀死项目

转载 作者:太空狗 更新时间:2023-10-30 03:25:58 24 4
gpt4 key购买 nike

我正在使用 dispatch_async 在后台运行一堆项目,有时我想杀死队列中的项目 - 这可能吗?例如,此代码在 View 上运行,然后用户返回屏幕。无论向后导航如何,所有这些触发的 Action 都会继续运行。理想情况下,我想停止运行这些项目:

dispatch_async(dispatch_get_global_queue(2, 0), ^{
for (int i=0; i<[self.manufacturers count]; i++) {
NSString *manufacturerID = [[[self.manufacturers objectAtIndex:i] ManufacturerID] stringValue];
[self doSync:manufacturerID withIndex:i setTimer:YES];
}
});

如果我创建一个队列并命名它,然后在调用的 View 的 dealloc 上释放它,它们仍然会继续运行。

最佳答案

在调度队列中没有明确规定终止。为了做到这一点,通常会测试逃逸位置以确定终止。基本上,它是一个信号量。

NSOperationQueue(更高级别的抽象,但仍使用底层的 GCD 构建)确实支持取消操作。因此,例如,您可以创建一系列 NSOperations 并将它们添加到 NSOperationQueue,然后在不需要它完成时向队列发送消息 -cancelAllOperations

您选择的许多架构将取决于其中有多少正在运行以及它们是否具有不同的触发器。在这些实现中,NSOperation 可能是“最干净”的解决方案,因为您有一个任意队列,您可以在其中观察要完成的操作,还可以取消未完成的操作。进一步降低黑客规模将是一个不稳定的位置,这些 block 中的每一个都在一个紧密的循环中观察,以确定它们是否会过早完成。再往下是相同基本功能的全局变量。

最后,即使是 NSOperation 的实现也涉及测试,以便在一致的位置退出(因为仅仅杀死一个线程可能会导致正在操作的数据或分配/重新训练中的不一致)。

关于objective-c - 在 iOS 的 dispatch_async 队列中杀死项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9546385/

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