一个Apple的网站,建议使用GCD队列而不是锁的模式:
// Create queue early
queue = dispatch_queue_create("com.example.tweets", NULL);
// executed main thread
- (NSArray *)getTweets
{
__block NSArray *a;
dispatch_sync(queue, ^{
a = [tweets copyTweets];
});
return a;
}
// executed on background thread
- (void)addTweet:(Tweet *)tw
{
dispatch_async(queue, ^{
[tweets addTweet:tw];
});
}
如果生产者线程一次添加大量推文而不是逐个添加推文,你如何使用GCD处理锁和关键部分?你需要一次读一条推文来获取UITableView的cellForRowAtIndexPath?
如果你在'read'上保持'sync',那不会导致很多不必要的块吗?这实际上是偶尔写的,但经常阅读场景..
答案 0 :(得分:1)
如果延迟是一个问题,那么制作人可能会逐个添加推文,因此来自UI线程的dispatch_sync调用仍保持响应。
我不担心“很多不必要的块”,除非/直到分析显示块调度开销实际上是一个问题。毕竟,只能为可见单元格调用cellForRowAtIndexPath,因此“经常阅读”意味着每秒几十次,而不是数千或数百万次。