【问题标题】:How to delete the dispatched block using GCD如何使用 GCD 删除已调度的块
【发布时间】:2014-12-25 16:16:57
【问题描述】:

我有这个代码:

_myQueue = dispatch_queue_create("com.myapp", DISPATCH_QUEUE_SERIAL);
            _mainQueue = dispatch_get_main_queue();

还有很多需要几秒钟(或几分钟)的块

dispatch_async(_myQueue,
               ^{
                  if(canRun){ 
                    dispatch_async(_mainQueue,^{/* updating interface here */});
                    // code here
                  }
                });

我的应用程序有一个“停止”按钮来尝试停止所有工作,BOOL“canRun”帮助我执行所有块而不做任何事情.....但我总是必须等待每个块的完成直到队列到达 0。 有没有办法立即“清理”队列而不是这样做? 目的是在不关闭和重新打开应用程序的情况下停止进程并重新开始。 该项目在 ARC 下运行。

【问题讨论】:

  • 为什么不使用 NSOperationQueue?你只是在重新发明一个你已经被赋予的优秀轮子......
  • 也许这篇文章有用? stackoverflow.com/questions/9546385/…
  • 是的,我发现用这种方式更新界面很容易......
  • 伙计们我承认我从未使用过它,但在这里阅读:stackoverflow.com/questions/12660706/…,他们似乎有同样的问题,一切都必须完成。我错了?谢谢
  • 我的意思是我需要在每个块中都有一个布尔值,而无需重新发明我正在编写更少代码行的井..

标签: macos cocoa automatic-ref-counting


【解决方案1】:

如果您采取一些额外步骤来创建 dispatch_source 对象并保留对它的引用,则可以取消它们。

为初学者查看此内容

https://developer.apple.com/library/mac/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html

有暂停、恢复和取消的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2013-07-15
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2022-01-24
    相关资源
    最近更新 更多