Для чего используется performBlock: NSManagedObjectContext?

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

2 ответов


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

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

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).

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


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

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

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

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

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

так вот в чем цель performBlock и performBlockAndWait.

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