2014-11-03 29 views
1

我想,當完成後臺操作做一些事情,我用下面的代碼來執行後臺操作:獲取當前後臺操作和處理它

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) {() -> Void in 
    //perform the background operation 
}) 

但是從不同的看法,如何我可以獲得當前的後臺操作並處理它嗎?
非常感謝:)

+2

除了下面的答案,請看'NSOperationQueue',它將GCD封裝在更高級別的API中。 – 2014-11-03 22:22:10

回答

4

一個通常不會「得到當前的後臺操作」。如果你想在後臺操作完成時做一些事情,你通常只是把它放在塊本身。舉例來說,如果你要更新的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

1

沒有「當前」後臺操作。有許多任意同時進行,並且您通過的塊被允許在dispatch_async返回之前完成(例如,您的線程被中斷以支持硬件中斷,或者只是在從dispatch_async返回之前立即獲得優先級的另一個線程,但在塊已放入調度隊列;您的塊在調度它的線程繼續之前開始和結束)。

您的操作完成後,您可能只想將dispatch_async返回至dispatch_get_main_queue()

2

最簡單的方法是在當前塊完成時分派另一個塊,但在主隊列中。

只有在主隊列上派發的塊才能更新UI元素。如果你在主隊列中調度一個塊,它將像一個方法那樣工作。如果您在另一個隊列上派發一個塊,使其在後臺運行,然後在該塊的末尾將另一個塊從第一個塊內的主隊列中分派回來,您將能夠從第一個塊中調用您想要的任何方法主隊列上的第二個塊。

+0

你能提供更多信息嗎? – 2014-11-03 22:19:36

+0

謝謝!請編輯以改善您的答案! – 2014-11-03 23:13:06