0

我用

 dispatch_async(getDataQueue,^{
    //do many work task A
    dispatch_aysnc (mainQueue, ^{
    //do
};
}
)

如果我按返回键,而 gcd 没有完成它的任务 A,我想打破 dispatch_async.how to do

4

2 回答 2

3

你可以使用一个标志来继续工作,它是假的:

// Somewhere accessible from the task's block and from the view controller
__block BOOL quit = NO;

dispatch_async(getDataQueue,^{
    dispatch_aysnc (mainQueue, ^{

        if (!quit)
        {
            // do first thing
        }

        if (!quit)
        {
             // do second thing
        }

        while (!quit)
        {
            // do lots of things
        }

    });
});

然后你可以简单地停止后台任务:

quit = YES;

无论如何,这是停止任何后台任务的首选方法,因为它允许任务在不强制终止之前执行清理。

于 2013-02-22T11:03:05.057 回答
0

你不可以做这个。关于 GCD 的一个基本事实是,一旦你调度了一个块,只要队列没有挂起,它就会无论如何运行。如果您需要可取消的异步操作,则需要使用NSOperation

于 2013-02-22T10:56:26.457 回答