Очереди GCD вместо блокировок: чтение данных для cellForRowAtIndexPath Tableview - PullRequest
1 голос
/ 16 декабря 2010

На одном сайте 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, когда у вас есть поток продюсера, добавляющий много твитовсразу, а не по одному, и вам нужно читать по одному твиту за раз для cellForRowAtIndexPath UITableView?

Если вы сохранили «синхронизацию» при каждом «чтении», не вызовет ли это много ненужногоблоки?Это действительно время от времени пишет, но часто читает сценарий ..

1 Ответ

1 голос
/ 16 декабря 2010

Если задержка вызывает беспокойство, возможно, производитель должен добавить твиты один за другим, чтобы вызовы dispatch_sync из потока пользовательского интерфейса оставались отзывчивыми.

Я бы не стал беспокоиться о «большом количестве ненужных блоков», если только / пока профилирование не покажет, что накладные расходы на отправку блоков на самом деле являются проблемой. В конце концов, cellForRowAtIndexPath будет вызываться только для видимых ячеек, поэтому «чтение часто» означает что-то вроде десятков раз в секунду, а не тысяч или миллионов.

...