Для чего используется executeBlock NSManagedObjectContext: - PullRequest
66 голосов
/ 29 марта 2012

В iOS 5 NSManagedObjectContext имеет несколько новых методов, performBlock: и performBlockAndWait:. Для чего на самом деле используются эти методы? Что они заменяют в старых версиях? Какие блоки должны быть переданы им? Как мне решить, какой использовать? Если у кого-нибудь есть примеры их использования, было бы замечательно.

Ответы [ 2 ]

124 голосов
/ 04 апреля 2012

Методы performBlock: и performBlockAndWait: используются для отправки сообщений вашему экземпляру NSManagedObjectContext, если MOC был инициализирован с использованием NSPrivateQueueConcurrencyType или NSMainQueueConcurrencyType.Если вы делаете что-либо с одним из этих типов контекста, например, устанавливаете постоянное хранилище или сохраняете изменения, вы делаете это в блоке.

performBlock: добавит блок в очередь резервного копирования и запланирует его запускна своей собственной теме.Блок вернется немедленно.Вы можете использовать это для длительных постоянных операций с резервным хранилищем.

performBlockAndWait: также добавит блок в очередь резервного копирования и запланирует его выполнение в своем собственном потоке.Однако блок не вернется, пока не завершится выполнение блока.Если вы не можете двигаться дальше, пока не узнаете, была ли операция успешной, то это ваш выбор.

Например:

__block NSError *error = nil;
[context performBlockAndWait:^{
    myManagedData.field = @"Hello";
    [context save:&error];
}];

if (error) {
    // handle the error.
}

Обратите внимание, что, поскольку я выполнил performBlockAndWait:,Я могу получить доступ к ошибке за пределами блока.Для performBlock: потребуется другой подход.

Из заметок о выпуске основных данных iOS 5 :

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

  • Confinement (NSConfinementConcurrencyType).

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

  • Частная очередь (NSPrivateQueueConcurrencyType).

    Контекст создает и управляет частной очередью,Вместо того, чтобы создавать и управлять потоком или очередью, с которой связан контекст, здесь контекст владеет очередью и управляет всеми деталями для вас (при условии, что вы используете блочные методы, как описано ниже).

  • Основная очередь (NSMainQueueConcurrencyType).

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

0 голосов
/ 22 ноября 2012

Они позволяют вам получить доступ к одинаковым managedObjectContext через потоки.

Я не совсем уверен, что я прав, но именно так я и использую.

Вы используете performBlockAndWait, как «обычный». Вам это не нужно, если вы выполняете managedObjectContext только в одном потоке. Если вы выполняете его во многих потоках, тогда да, вам понадобится performBlock.

Итак, если вы в главном потоке, вам не нужно делать performBlockAndWait для основного managedObjectContext. По крайней мере, у меня нет и все в порядке.

Однако, если вы обращаетесь к этому managedObjectContext в других потоках, тогда да, вам нужно будет сделать performBlockAndWait.

Так что это цель performBlock и performBlockAndWait.

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

...