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 关注
- 685 浏览
添加回答
举报