Iphone 取消分派队列

Iphone 取消分派队列,iphone,uiviewcontroller,background-process,grand-central-dispatch,Iphone,Uiviewcontroller,Background Process,Grand Central Dispatch,我在应用程序中使用grandcentraldispatch,以便在后台运行一个方法。该方法根据用户的输入计算一些数学数据,需要一点时间。请记住,它不是在使用互联网 每当主视图加载时,我都会运行这个后台“compute”方法(它是一个调度队列)。问题是,如果用户在后台运行方法时切换应用程序中的视图,应用程序就会崩溃 当用户切换视图时,是否有任何方法“取消”队列/停止代码块运行?另一种思考方法是查看iphoneweather.app。天气加载时,它会在后台下载数据,在下载时按下角落里的小信息按钮不会

我在应用程序中使用grandcentraldispatch,以便在后台运行一个方法。该方法根据用户的输入计算一些数学数据,需要一点时间。请记住,它不是在使用互联网

每当主视图加载时,我都会运行这个后台“compute”方法(它是一个调度队列)。问题是,如果用户在后台运行方法时切换应用程序中的视图,应用程序就会崩溃

当用户切换视图时,是否有任何方法“取消”队列/停止代码块运行?另一种思考方法是查看iphoneweather.app。天气加载时,它会在后台下载数据,在下载时按下角落里的小信息按钮不会使应用程序崩溃

谢谢

queue = dispatch_queue_create("com.mycompany.myqueue", 0);

dispatch_async(queue, ^{  
    //make some complicated calculations
});

一旦块开始执行,暂停队列本身将不会有任何帮助。但是您可以使用_块限定符定义一个名为“cancel”的BOOL,然后在计算的适当阶段(在每个迭代或其他段),您可以在继续之前检查“cancel”是否仍然为否。

其他人已经建议使用设置共享取消标志的简单技术(这是取消的方式,因为GCD不隐式支持取消)但是,当用户切换视图时,应用程序崩溃这一事实也意味着在块内部正在进行的工作与UI状态密切相关。当用户切换时,您的后台块会被这一事实致命地混淆,这表明您确实需要对代码进行重构。您应该已经准备好了在主队列上分发所有AppKit或UIKit调用,因为它们无法从任何其他队列工作,因此必须有一个对象引用,当用户切换视图时会发生更改,您只需考虑在检查操作后立即取消该操作,并且您仍在加速用户交互的情况GCD减轻了多线程代码的负担,但它并不是解决诸如共享对象引用之类的并发问题的灵丹妙药——这些问题仍然存在,而且是很难解决的问题,GCD只是让解决这些问题变得更容易(比如允许您为代码中的每个共享/争用对象创建相应的串行队列,并重构setter/getter方法以将该队列用作并发屏障).

首先,GCD现在支持取消。使用
调度块
创建块,将该块分配到您的队列,然后定期检查循环内执行复杂计算的
调度块
,然后如果您
调度块
,您复杂的循环可以
中断
(或其他)如果取消。请参见。第二,您还可以使用
weakSelf
模式,定期检查它是否为
nil
,如果出现这种情况,请停止计算。