Основные данные NSPrivateQueueConcurrencyType и данные обмена данными между streamами

В iOS 5 появился новый способ быстро получить данные в фоновом streamе, инициализируя MOC с помощью NSPrivateQueueConcurrencyType а затем выполнив выборку в performBlock:

Одним из основных правил Core Data было то, что вы не можете совместно использовать управляемый объект между streamами / очередями. Это все еще имеет место с performBlock: Есть следующее:

 [context performBlock:^{ // fetch request code NSArray *results = [context executeFetchRequest:request error:nil]; dispatch_async(dispatch_get_main_queue(), ^(void) { Class *firstObject = [results objectAtIndex:0]; // do something with firstObject }); }]; 

все еще неприемлемо, так как я делюсь своим массивом / объектами результатов между очередью bg и основной очередью? Нужно ли мне все же использовать идентификаторы управляемых объектов?

Когда вы используете NSPrivateQueueConcurrencyType вам нужно сделать все, что касается этого контекста или любого объекта, принадлежащего этому контексту внутри метода -performBlock: .

Ваш код выше является незаконным, поскольку вы передаете эти объекты обратно в основную очередь. Новый API помогает вам в решении этого: вы создаете один контекст, связанный с основной очередью, то есть с NSMainQueueConcurrencyType :

 // Assume we have these two context (They need to be set up. Assume they are.) NSManagedObjectContext *mainMOC = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease]; NSManagedObjectContext *backgroundMOC = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease]; // Now this can safely be called from ANY thread: [backgroundMOC performBlock:^{ NSArray *results = [backgroundMOC executeFetchRequest:request error:nil]; for (NSManagedObject *mo in results) { NSManagedObjectID *moid = [mo objectID]; [mainMOC performBlock:^{ NSManagedObject *mainMO = [mainMOC objectWithID:moid]; // Do stuff with 'mainMO'. Be careful NOT to use 'mo'. }]; } }]; 

Это становится менее запутанным, если вы переместите внутренний [mainMOC performBlock:] в свой собственный метод. Вы также можете передать массив идентификаторов объектов обратно в контекст основного streamа вместо выполнения блока для каждого идентификатора объекта. Это зависит от ваших потребностей.

Как объясняет Даниэль Эггерт, это определенно все еще так. Исключение составляет NSMainQueueConcurrencyType , где вы также можете безопасно использовать контекст и объекты управляемого объекта в основном streamе (а также из других streamов через механизм executeBlock). Полезность этого нельзя недооценивать!

В iOS 5 также была представлена ​​концепция родительских контекстов, которая также значительно упрощает фоновые операции и устраняет необходимость беспокоиться об использовании уведомлений для распространения изменений между streamами.

Видео WWDC 2012 «Сессия 214 -« Лучшая практика основных данных » более подробно изложена по обоим предметам и является очень всеобъемлющей. Видеоролик является важным просмотром для тех, кто использует Core Data.

  • UIDatePicker появляется после нажатия кнопки UIButton
  • Форматирование даты и времени с помощью iPhone SDK?
  • Шифрование AES для NSString на iPhone
  • iPhone: Как получить текущие миллисекунды?
  • Изменить агент пользователя в UIWebView (iPhone SDK)
  • objective C: Как вы можете повернуть текст для UIButton и UILabel?
  • iPhone: добавление значка приложения через локальное уведомление
  • Как просмотреть данные в файле sqlite, запущенном в приложении iphone?
  • Как определить, установлен ли iPhone для 12-часового или 24-часового отображения времени?
  • Мое приложение «содержит шифрование»?
  • iPhone WebKit CSS анимации вызывают мерцание
  • Interesting Posts

    Переустановите Windows 7: OEM или стандарт?

    Каков наилучший способ решения конфликта объектов Objective-C?

    Потенциально опасное значение Request.Path было обнаружено у клиента (*)

    Значок меню параметров Android не будет отображаться

    Что означает «процессор» и «процессор ядра» в / proc / cpuinfo?

    Сравнение двух чисел в пакетном скрипте

    Что такое использование BaseColumns в Android?

    Ориентировочная стоимость доступа к различным кешам и основной памяти?

    Есть ли способ разбивки запросов путем комбинирования курсоров запросов с использованием FirestoreRecyclerAdapter?

    Создание 3D-сферы в Opengl с использованием Visual C ++

    Java: нестатические вложенные classы и instance.super ()

    Какой самый простой способ сохранить GIFV как простой GIF?

    Как использовать nawk, как печатать все имена, содержащие четыре символа?

    Не удается удаленный доступ к компьютеру, потому что «удаленному компьютеру требуется сетевая аутентификация»

    Программное обеспечение для получения звука с домашних DVD-дисков?

    Давайте будем гением компьютера.