ios - 暂停和恢复 Grand Central Dispatch 线程

标签 ios objective-c grand-central-dispatch

我正在使用 Grand Central Dispatch 在后台运行一个进程。我想知道如何暂停、恢复和停止该后台线程。我试过了

dispatch_suspend(background_thread);
dispatch_resume(background_thread);

但是这些功能对我没有帮助,它一直在运行。请有人帮助我。

最佳答案

你好像有点糊涂了。线程的直接操作不是 GCD API 的一部分。您通常操作的 GCD 对象是队列,而不是线程。您将 block 放入队列中,然后 GCD 在它需要的任何线程上运行这些 block 。1

此外,the dispatch_suspend man page是这样说的:

The dispatch framework always checks the suspension status before executing a block, but such changes never affect a block during execution (non-preemptive).

换句话说,当队列正在运行一个 block 时,GCD 不会挂起队列。它只会在队列位于 block 之间时挂起队列。

我不知道有任何公共(public) API 可以让您在不与该线程上运行的函数合作的情况下停止线程(例如,通过设置一个在该线程上定期检查的标志)。

如果可能,您应该分解长时间运行的计算,以便您可以在连续的 block 中逐步处理它。然后你可以暂停运行这些 block 的队列。


脚注 1. 主队列除外。如果您将一个 block 放在主队列上,GCD 只会在主线程上运行该 block 。

关于ios - 暂停和恢复 Grand Central Dispatch 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22652053/

相关文章:

objective-c - 如何在 Objective-C 中创建一个空白的透明 png?

iphone - geocodeAddressString无法识别的选择器错误处理结果

iPhone - 将字符串截断到最后四位

ios - 需要同时发出两个 HTTP 网络请求(完成处理程序一旦完成)

ios - dispatch_after 会阻塞主线程吗?

c++ - dispatch_queue_t 作为 C++ 类中的实例变量

ios - Swift 3.0 FileManager.fileExists(atPath :) always return false

ios - Collection View 更改单元格大小

c++ - 在不同的线程上发送和接收

objective-c - 将 subview 添加到零大小的 UIView