Подтвердить что ты не робот

Типы iOS5 NSManagedObjectContext Concurrency и как они используются?

Литература кажется немного редкой в ​​настоящее время о новых типах NSManagedObjectContext concurrency. Помимо WWDC 2011 vids и некоторой другой информации, которую я поднял по пути, мне все еще трудно понять, как используется каждый тип concurrency. Ниже я описываю, как я интерпретирую каждый тип. Пожалуйста, поправьте меня, если я что-то неправильно понимаю.

NSConfinementConcurrencyType

Этот тип был нормой в течение последних нескольких лет. MOC экранированы от каждой нити. Поэтому, если поток A MOC хочет объединить данные из MOC потока B с помощью сообщения сохранения, потоку A необходимо будет подписаться на уведомление о потоке B MOC.

NSPrivateQueueConcurrencyType

Каждое дерево MOC (родительские и дочерние MOC) разделяет одну и ту же очередь независимо от того, какой поток включен. Поэтому всякий раз, когда отправляется сообщение о сохранении из любого из этих контекстов, оно помещается в частную подсказку, специально созданную только для этого дерева MOC.

NSMainQueueConcurrencyType

Все еще запутано это. Из того, что я собираю, похоже на NSPrivateQueueConcurrencyType, только личная очередь запускается в потоке main. Я читал, что это выгодно для коммуникаций с MOC, но почему? Почему я должен выбирать это по типу NSPrivateQueueConcurrencyType? Я предполагаю, что, поскольку NSMainQueueConcurrencyType выполняется в основном потоке, не позволяет ли это выполнять фоновые процессы? Разве это не так, как не использовать потоки?

4b9b3361

Ответ 1

Типы очереди concurrency помогают вам управлять переданными базовыми данными mutlithreaded:

Для обоих типов действия выполняются только в правильной очереди, когда вы их используете, используя один из методов executeBlock. то есть.

[context performBlock:^{
    dataObject.title = @"Title";
    [context save:nil]; // Do actual error handling here
}];

Тип частной очереди concurrency делает все, что работает, в фоновом потоке. Отлично подходит для обработки или диска io.

Основной тип очереди просто выполняет все действия на UIThread. Это необходимо, когда вам нужно  например, привязать NSFetchedResultsController к нему или любые другие связанные с ui задачи, которые необходимо переплетать с обработкой этих объектов контекста.

Настоящая забава приходит, когда вы их объединяете. Представьте, что у вас есть родительский контекст, который делает все io на фоновом потоке, который является контекстом частной очереди, а затем вы выполняете всю свою работу ui против дочернего контекста основного типа очереди. То, что делает UIManagedDocument. Это позволяет вам держать очередь UI свободной от занятости, которая должна быть выполнена для управления данными.

Ответ 2

Я думаю, что ответы в примечании: Замечания по выпуску основных данных для Mac OS X Lion http://developer.apple.com/library/mac/#releasenotes/DataManagement/RN-CoreData/_index.html

Для NSPrivateQueueConcurrencyType, я думаю, что вы не правы. Детский контекст, созданный с помощью этого типа concurrency, будет иметь свою собственную очередь. Контекст parent/child не полностью связан с потоковой обработкой. Родитель/ребенок, кажется, упрощает общение между контекстами. Я понимаю, что вам просто нужно сохранить изменения в дочерних контекстах, чтобы вернуть их в родительский контекст (я еще не тестировал его). Обычно шаблон родительского/дочернего контекста связан с шаблоном очереди основной очереди/фона, но он не является обязательным. [EDIT] Кажется, что доступ к хранилищу (сохранение и загрузка) осуществляется через главный контекст (в основной очереди). Таким образом, это нехорошее решение для выполнения фоновых захватов, поскольку запрос за выполнением executeFetchRequest всегда будет выполняться в основной очереди.

Для NSMainQueueConcurrencyType он совпадает с NSPrivateQueueConcurrencyType, но поскольку он связан с основной очередью, я понимаю, что вы выполняете операцию с контекстом без необходимости использования функции executeBlock; если вы находитесь в контексте основной очереди, например, в деле делегирования контроллера диспетчера (viewDidLoad и т.д.).

Ответ 3

midas06 писал (а):

Представьте, что у вас есть родительский контекст, который делает все io на фоне поток, который является частным контекстом очереди, а затем вы делаете все свои ui работать с дочерним контекстом основного типа очереди.

Я понял, что это наоборот: вы помещаете родительский контекст в основной поток, используя NSMainQueueConcurrencyType и дочерний контекст в фоновом потоке, используя NSPrivateQueyeConcurrencyType. Я не прав?