NSOperation и CoreData Threading - PullRequest
       17

NSOperation и CoreData Threading

5 голосов
/ 12 ноября 2009

Я передаю некоторые данные NSManagedObject между двумя потоками, используя NSOperationQueue с уровнем параллелизма, не превышающим 1, и мне хотелось бы получить несколько советов о том, правильно ли я это делаю.

Поскольку NSManagedObject не является потокобезопасным, я отправляю в NSManagedObjectID из ThreadA (основной поток) в ThreadB через производный класс NSOperation. Общий рабочий процесс:

Нить A (основная нить):

  • создает NSPersistentStoreCoordinator
  • создает основной NSManagedObjectContext (1)
  • создает NSManagedObjectContext (2) для использования в workerThread

  • создает MyNSOperationItem, передает NSManagedObjectContext и добавляет MyNSOperationItem в NSOperationQueue

Тема B (поток NSOperationQueue):

  • Производный класс NSOperation будет извлекать данные из постоянного
    хранить с использованием прилагаемого objectID.

Мой класс NSOperation выглядит так:

@interface MyNSOperationItem: NSOperation
{
    // MyNSOperationItem is created in thread1 and MOC will be 
    // set on creation
    NSManagedObjectContext   *threadedMOC;

    NSManagedObjectID        *workItemObjectID;
}
@end

Так нормально ли, чтобы мой производный класс NSOperation имел ссылку на NSManagedObjectContext или я должен хранить второй NSManagedObjectContext где-нибудь еще? Поскольку это очередь, будут созданы многочисленные экземпляры MyNSOperationItem, каждый из которых указывает на один и тот же NSManagedObjectContext.

1 Ответ

5 голосов
/ 13 ноября 2009

Я думаю, что это должно дать вам все, что вам нужно:

http://developer.apple.com/mac/libra...reData/Articles/cdMultiThreading.html

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

Загрузка в фоновом потоке

Один из самых простых многопоточных методы, которые вы можете использовать с Core Data улучшить отзывчивость приложения это выполнить запрос на выборку фоновый поток. (Обратите внимание, что это Техника полезна, только если вы используя хранилище SQLite, так как данные из двоичные и XML-хранилища читаются в память сразу при открытии.) Это означает, что если выборка сложна или возвращает большое количество данных, вы может вернуть управление пользователю и отображать результаты по мере их поступления. Для пример того, как это сделать, см. Пример BackgroundFetching в /Developer/Examples/CoreData/.

Вы используете два контекста управляемого объекта связано с одним постоянным координатор магазина. Вы получаете в одном контекст управляемого объекта на фоне поток и передать идентификаторы объектов извлекал объекты в другой поток. В вторая нить (обычно основной поток приложения, так что вы затем можно отобразить результаты), вы используете второй контекст для ошибки в объектах с этими идентификаторами объектов (вы используете objectWithID: для создания экземпляра объект).

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