2010-09-14 1 views
1

Мой вопрос, вкратце: Есть ли способ сделать потокобезопасную сборку KVO-сборщиков потокобезопасной с той же блокировкой, что методы @synthesized заблокированы?Ключевое значение кодирования для изменяемых коллекций и атомных аксессуаров

Объяснение: У меня есть класс контроллера, который содержит коллекцию (NSMutableArray) объектов Post. Эти объекты загружаются с веб-сайта, поэтому коллекция время от времени меняется. Я хотел бы иметь возможность использовать наблюдение за ключом для наблюдения за массивом, чтобы обновить интерфейс.

Мой контроллер имеет posts свойство, объявленный следующим образом:

@property (retain) NSMutableArray *posts; 

Если я позвоню @synthesize в моем файле .m, он будет создавать -(NSMutableArray *)posts и -(void)setPosts:(NSMutableArray *)obj методы для меня. Кроме того, они будут защищены блокировкой, так что два потока не могут топать друг на друга при настройке (или получении) значения.

Однако, чтобы быть совместимым с ключевыми значениями для изменяемой упорядоченной коллекции, существует несколько других методов, которые мне нужно реализовать. В частности, мне нужно реализовать at least the following:

-insertObject:inPostsAtIndex: 
-removeObjectFromPostsAtIndex: 

Однако, поскольку сообщения загружаются асинхронно, я хотел бы иметь возможность добавлять новые сообщения в массив на фоне потока, а также. Это означает, что доступ должен быть потокобезопасным.

Итак, мой вопрос. Есть ли способ сделать эти средства доступа потокобезопасными с той же блокировкой, что методы @synthesized заблокированы? Или мне нужно прибегнуть к определению методов setPosts: и posts, чтобы гарантировать полную атомарность всех аксессуаров?

ответ

3

Документы Objective-C на developer.apple.com [1] не указывают, что существует способ использования одной и той же блокировки для ваших явно определенных функций, которые используются для ваших функций @synthesized. В этом случае я бы сказал, что для того, чтобы быть полностью безопасным, было бы лучше полностью определить свои собственные функции, чтобы убедиться, что все они используют одну и ту же блокировку.

Возможно, вы можете использовать отладчик для определения имени блокировки, которое будет использоваться для ваших функций @synthesized, но это не то, на что я бы положился.

0

Возможно, вы действительно не хотите этого делать. Если вы добьетесь успеха, KVO-уведомления будут получены в том же потоке, который вносит изменения, и если это фоновый поток, будет непригоден для обновления пользовательского интерфейса.

Вместо этого, почему бы вам не задать свой фоновый поток свойства с помощью основного потока? Тогда вам даже не нужно, чтобы свойство было атомарным.

Смежные вопросы