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

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

2 ответа

Решение

Методы 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).

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

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

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

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

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

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

Так что это цель performBlock а также performBlockAndWait,

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

Другие вопросы по тегам