2013-04-08 56 views
0

我在調度組中的隊列完成執行後調用方法。但是,即使所有隊列都已執行完畢,執行最終方法仍然存在重大延遲。任何人都可以解釋任何可能的原因?在iOS中完成調度組操作後執行方法的延遲

dispatch_group_t group = dispatch_group_create(); 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

dispatch_group_async(group, queue,^{ 
    //some code    
} 


dispatch_group_notify(group, queue, 
    ^{ 
     [self allTasksDone]; 
    }); 

我的意思是,該方法allTask​​sDone是,即使在異步隊列操作完成一些延遲後執行。

+0

請在您的問題中添加一些代碼。幾乎不可能猜到你想要什麼。 – kovpas 2013-04-08 14:13:07

+0

你怎麼加延遲?你使用dispatch_after或者performSelector嗎? – sixthcent 2013-04-08 14:15:45

+0

不,我沒有添加任何類型的延遲。我添加了一些代碼,以便猜測可能發生的情況。 – wanderer 2013-04-08 14:28:38

回答

2

-allTasksDone如何工作?如果它通過更新用戶界面元素與用戶通信,則需要在主線程的上下文中運行,否則會出現相關UI元素「延遲」 - 直到主線程運行時纔會更新循環恰好使他們更新。

試試這個:

dispatch_group_notify(group, dispatch_get_main_queue(), 
^{ 
    [self allTasksDone]; 
}); 

正因爲如此,你在默認的背景隊列,這沒有發揮好與AppKit的或UIKit的運行-allTasksDone

+0

感謝您的建議。我目前沒有和我在一起,但當明天回去工作時我會試試這個。 – wanderer 2013-04-08 22:10:54

+0

嘿iluvcapra,謝謝,它現在工作正常。 – wanderer 2013-04-09 10:49:10

0

我建議一種替代方法,儘管您可以使用調度組來確定完成此操作。

// Important note: This does not work with global queues, but you can use target queues to direct your custom queue to one of your global queues if you need priorities. 
dispatch_queue_t queue = dispatch_queue_create("com.mycompany.myqueue", DISPATCH_QUEUE_CONCURRENT); 

dispatch_async(queue,^{ 
    //some code    
} 

dispatch_barrier_async(queue, 
    ^{ 
     // this executes when all previously dispatched blocks have finished. 
     [self allTasksDone]; 
    });