0

У меня есть NSMutaleArray, который содержит экземпляры класса X. Ячейка tableView в строке i заполняется с использованием содержимого массива с индексом i.NSMutableArray с данными источника таблицы, измененными в нескольких потоках, как избежать блокировки при настройке ячейки

Содержимое массива создается на основе входящих данных JSON из сети. Итак, у меня есть вспомогательная функция, которая преобразует данные JSON в эти объекты и сохраняет их в массиве. Объект может быть изменен после сохранения в массиве (например, изображение, принадлежащее ячейке, загружается, а указатель файла добавляется к объекту).

В настоящее время я делаю чтение и запись потоков, безопасно помещая их в dispatch_sync & dispatch_barrier_async. Некоторые вопросы, которые я вижу

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

  2. Есть ли какой-то умный способ для блока, отправленного через dispatch_sync и disaptch_barrier_sync, только ждать, будет ли другой блок изменяться, удаление одного и того же индекса NSMUtableArray или связанного с ним значения являются ключом NSMUtableDictionary?

  3. Чтобы сделать код более читаемым, я подумываю о подклассификации NSMutableArray и создании класса THreadSafeMutableArray, который превосходит методы objectForIndex и subscript. Любые проблемы с этим подходом?

ответ

0

Ваш NSMutableArray должен быть атомным свойством (по умолчанию это значение), возможно, вы изменили на неатомическое объявление. Посмотрите документацию: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

Яблока документацию:

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

@interface XYZObject : NSObject 
@property NSObject *implicitAtomicObject;   // atomic by default 
@property (atomic) NSObject *explicitAtomicObject; // explicitly marked atomic 
@end