Обновление источника данных NSTableView из фонового потока - PullRequest
1 голос
/ 11 октября 2010

Каков наилучший способ синхронизации источника данных, который часто обновляется из фонового потока, с основным потоком графического интерфейса пользователя?

Должен ли я помещать мьютекс pthread вокруг каждого вызова метода?Мне кажется, это слишком тяжело.

РЕДАКТИРОВАТЬ: Я ищу решение 10,5

Ответы [ 2 ]

2 голосов
/ 11 октября 2010

Вы всегда можете обновить модель и табличное представление в главном потоке.В NSObject есть функции, подобные performSelectorOnMainThread:withObject:waitUntilDone:, которые позволяют легко выполнять вызов функции в главном потоке.Таким образом, вы можете обновить свою модель с помощью:

[model performSelectorOnMainThread:@selector(addObject:) withObject:newObject waitUntilDone:YES];

, а затем обновить таблицу:тогда вам нужно использовать вызовы, но я обнаружил, что эти функции можно использовать большую часть времени.

1 голос
/ 11 октября 2010

Это на Snow Leopard или вы хотите сохранить совместимость с 10.2+?Если вы не можете поддерживать обратную совместимость, вы можете выделить код, который применяет обновления к другому методу, и вызвать его, используя performSelectorOnMainThread:withObject:waitUntilDone:

В качестве альтернативы, если вы предпочитаете играть с новыми игрушкамии чтобы ваш код был более читабельным (т. е. сводить количество методов к минимуму), вы можете сделать это в линии, используя блоков и Grand Central Dispatch .Может оказаться достаточным что-то вроде следующего:

// The following line is (presumably) executed in your background thread
NSMutableArray *newEntries = [self doSomeHeavyLiftingInBackground];
dispatch_async(dispatch_get_main_queue(), ^{
    /* The following lines are executed in the context of your main 
    thread's run loop. You don't need to mess about with locks as it
    will not be executed concurrently with UI updates. */
    id<NSTableViewDataSource> dataSource = [self getDataSource];
    NSMutableArray *dataSourceInnards = [dataSource whyIsThisMethodHere];
    [dataSourceInnards addObjectsFromArray:newEntries];
    [dataSource tellTableViewToReload];
});

Преимущество этого состоит в том, что вам не нужно преобразовывать код в шаблон передачи одного объекта в отдельный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...