3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
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貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
基本上,要提交到后臺(tái)隊(duì)列的任何工作都需要遵循以下代碼模式:
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變量是一個(gè)引用計(jì)數(shù)對(duì)象,因?yàn)樗且粋€(gè)專(zhuān)用隊(duì)列,而不是全局隊(duì)列。因此,它被在該隊(duì)列內(nèi)執(zhí)行的塊保留。在此任務(wù)完成之前,不會(huì)釋放它。
2-每個(gè)隊(duì)列都有自己的堆棧,這將作為遞歸操作的一部分進(jìn)行分配/釋放。您只需要擔(dān)心引用成員計(jì)數(shù)的類(lèi)成員變量(強(qiáng),保留等),這些變量可以在上面的doWork中訪(fǎng)問(wèn)。
3-在后臺(tái)隊(duì)列操作中訪(fǎng)問(wèn)那些引用計(jì)數(shù)的var時(shí),您需要根據(jù)應(yīng)用程序的使用情況使它們成為線(xiàn)程安全的。示例包括對(duì)對(duì)象(例如字符串,數(shù)組等)的寫(xiě)操作。這些寫(xiě)操作應(yīng)封裝在@synchronized關(guān)鍵字中,以確保線(xiàn)程安全訪(fǎng)問(wèn)。
@synchronized 確保在執(zhí)行其封裝的塊期間,沒(méi)有其他線(xiàn)程可以訪(fǎng)問(wèn)其保護(hù)的資源。
@synchronized(myMutableArray)
{
//operation
}
在上面的代碼塊中,任何其他線(xiàn)程都不允許myMutableArray對(duì)該@synchronized塊內(nèi)部進(jìn)行任何更改。
- 3 回答
- 0 關(guān)注
- 755 瀏覽
添加回答
舉報(bào)