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

Что такое NSManagedObjectContext executeBlock: используется для?

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

4b9b3361

Ответ 1

Методы 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:, у вас есть три варианта для своей ассоциации потоков (очереди)

  • Конфайнмент (NSConfinementConcurrencyType).

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

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

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

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

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

Ответ 2

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

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

Вы используете performBlockAndWait, как "обычный". Это вам не нужно, если вы выполняете управляемый объектObjectContext только в одном потоке. Если вы выполните его во многих потоках, тогда да вам понадобится performBlock.

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

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

Итак, цель performBlock и performBlockAndWait.

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