GCD队列而不是锁:读取Tableview的cellForRowAtIndexPath的数据

时间:2010-12-16 04:30:44

标签: iphone objective-c grand-central-dispatch

一个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',那不会导致很多不必要的块吗?这实际上是偶尔写的,但经常阅读场景..

1 个答案:

答案 0 :(得分:1)

如果延迟是一个问题,那么制作人可能会逐个添加推文,因此来自UI线程的dispatch_sync调用仍保持响应。

我不担心“很多不必要的块”,除非/直到分析显示块调度开销实际上是一个问题。毕竟,只能为可见单元格调用cellForRowAtIndexPath,因此“经常阅读”意味着每秒几十次,而不是数千或数百万次。