2013-02-22 6 views
0

я используюперерыв Grand Central Dispatch запустить

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

если я нажать на клавишу возврата, а НОД не закончил свою задачу А, я хочу, чтобы разбить dispatch_async.how сделать

+0

Что значит «сломать» его? – borrrden

ответ

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; 

Это предпочтительный метод остановки любой фоновой задачи в любом случае, поскольку это позволяет задачу выполнить очистку без, прежде чем вынужден прекратить.

+1

не должен «BOOL quit» быть типом __блока или sysnthesize BOOL quit? Работает ли он с типом статического BOOL? –

+0

@MalcolmMashmallow Да, вы правы. Приветствия. – trojanfoe

+0

использовать bool выйти только отменить mainQueue, если я хочу отменить chiledQueue, например, не скачать – pengwang

0

Вы не можете это сделать , Одна из основополагающих истин о GCD заключается в том, что после отправки блока он будет работать независимо от того, что, пока очередь не приостановлена. Если вам нужны аннулированию асинхронных операции, вам нужно будет использовать NSOperation

+1

Если вы не выполняете 'while (! Quit) {...}', и вы управляете флагом 'quit' ... – trojanfoe

+0

@trojanfoe Вы меня туда, но это особый случай ^^; – borrrden

+0

Отправка блока означает только его очередь на выполнение. Если вы вызываете 'dispatch_suspend' до того, как данный блок будет выполнен, тогда блок не будет выполнен. Итак, строго говоря, то, что вы написали, неверно. – lawicko

Смежные вопросы