我想,當完成後臺操作做一些事情,我用下面的代碼來執行後臺操作:獲取當前後臺操作和處理它
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) {() -> Void in
//perform the background operation
})
但是從不同的看法,如何我可以獲得當前的後臺操作並處理它嗎?
非常感謝:)
我想,當完成後臺操作做一些事情,我用下面的代碼來執行後臺操作:獲取當前後臺操作和處理它
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) {() -> Void in
//perform the background operation
})
但是從不同的看法,如何我可以獲得當前的後臺操作並處理它嗎?
非常感謝:)
一個通常不會「得到當前的後臺操作」。如果你想在後臺操作完成時做一些事情,你通常只是把它放在塊本身。舉例來說,如果你要更新的UI(主隊列),當後臺任務完成後,你會做這樣的事情:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// perform the background operation
// now do whatever you want when the above is done
dispatch_async(dispatch_get_main_queue(), ^{
// do whatever you want here
});
});
如果你有一系列的塊,你已經分赴背景,要等它們全部完成,你通常使用一個調度組:
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t notificationQueue = dispatch_get_main_queue();
dispatch_group_async(group, queue, ^{
// do something
});
dispatch_group_async(group, queue, ^{
// do something else
});
dispatch_group_notify(group, notificationQueue, ^{
// whatever you want when the above dispatched blocks finish
});
或者你可以使用操作隊列,要麼設置爲一個給定的操作completionBlock
,或創建取決於其他操作的新操作(只有在其他操作完成時纔會觸發)。顯然,上面所有的例子都在Objective-C中,但是一般模式在Swift中也同樣適用。
有關異步編程技術的更多信息,請參閱Concurrency Programming Guide。或參考WWDC 2012 video - Asynchronous Design Patterns with Blocks, GCD, and XPC。
沒有「當前」後臺操作。有許多任意同時進行,並且您通過的塊被允許在dispatch_async
返回之前完成(例如,您的線程被中斷以支持硬件中斷,或者只是在從dispatch_async
返回之前立即獲得優先級的另一個線程,但在塊已放入調度隊列;您的塊在調度它的線程繼續之前開始和結束)。
您的操作完成後,您可能只想將dispatch_async
返回至dispatch_get_main_queue()
。
最簡單的方法是在當前塊完成時分派另一個塊,但在主隊列中。
只有在主隊列上派發的塊才能更新UI元素。如果你在主隊列中調度一個塊,它將像一個方法那樣工作。如果您在另一個隊列上派發一個塊,使其在後臺運行,然後在該塊的末尾將另一個塊從第一個塊內的主隊列中分派回來,您將能夠從第一個塊中調用您想要的任何方法主隊列上的第二個塊。
你能提供更多信息嗎? – 2014-11-03 22:19:36
謝謝!請編輯以改善您的答案! – 2014-11-03 23:13:06
除了下面的答案,請看'NSOperationQueue',它將GCD封裝在更高級別的API中。 – 2014-11-03 22:22:10