3 回答

TA貢獻1824條經驗 獲得超5個贊
dispatch_queue_t backgroundQueue;
backgroundQueue = dispatch_queue_create("com.images.bgqueue", NULL);
- (void)process {
dispatch_async(backgroundQueue, ^(void){
//background task
[self processHtml];
dispatch_async(main, ^{
// UI updates in main queue
[self workDone];
});
});
});
}

TA貢獻1951條經驗 獲得超3個贊
基本上,要提交到后臺隊列的任何工作都需要遵循以下代碼模式:
dispatch_queue_t queue = dispatch_queue_create("com.myappname", 0);
__weak MyClass *weakSelf = self; //must be weak to avoid retain cycle
//Assign async work
dispatch_async(queue,
^{
[weakSelf doWork];
dispatch_async(dispatch_get_main_queue(),
^{
[weakSelf workDone];
});
});
queue = nil; //Using ARC, we nil out. Block always retains the queue.
永不忘記:
上面的1-queue變量是一個引用計數對象,因為它是一個專用隊列,而不是全局隊列。因此,它被在該隊列內執行的塊保留。在此任務完成之前,不會釋放它。
2-每個隊列都有自己的堆棧,這將作為遞歸操作的一部分進行分配/釋放。您只需要擔心引用成員計數的類成員變量(強,保留等),這些變量可以在上面的doWork中訪問。
3-在后臺隊列操作中訪問那些引用計數的var時,您需要根據應用程序的使用情況使它們成為線程安全的。示例包括對對象(例如字符串,數組等)的寫操作。這些寫操作應封裝在@synchronized關鍵字中,以確保線程安全訪問。
@synchronized 確保在執行其封裝的塊期間,沒有其他線程可以訪問其保護的資源。
@synchronized(myMutableArray)
{
//operation
}
在上面的代碼塊中,任何其他線程都不允許myMutableArray對該@synchronized塊內部進行任何更改。
- 3 回答
- 0 關注
- 758 瀏覽
添加回答
舉報