0

私が使う

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

戻るキーを押して、gcd がタスク A を完了していない場合、dispatch_async を中断したい。

4

2 に答える 2

3

フラグを使用して、false の場合は常に機能し続けることができます。

// 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 に関する基本的な真実の 1 つは、ブロックをディスパッチすると、キューが一時停止されていない限り、何があっても実行されるということです。キャンセル可能な非同期操作が必要な場合は、使用する必要がありますNSOperation

于 2013-02-22T10:56:26.457 に答える