2013-10-14 3 views
0
Utility.managedObjectContext().performBlockAndWait({ 

}) 

dispatch_sync(dispatch_get_main_queue(), { 

}) 
  1. Любопытно, что разница между выше? Контексте был создан два кода с .MainQueueConcurrencyType вариантом.
  2. Если я выполняю блоки на главной очереди, являются очереди, выполненные в FIFO порядок? Или они могут перекрываться, операция смешиваются? Т.е. (a1, a2, a3), (b1, b2, b3) может привести (a1, b1, a2, a3, b2, b3)?

ответ

0

Вы здесь смешиваются два совершенно разных понятия, но поскольку это основной поток/контекст/очередь, ваш микс маскируется, и он «работает».

Методы управляемого объекта контекста performBlockAndWait: и performBlock: не предоставляют никаких гарантий, по какому потоку выполняется этот блок, только безопасный доступ к данным, к которым осуществляется доступ/мутация. Поскольку ваш контекст имеет тип параллелизма основной очереди, это исключение состоит в том, что безопасно касаться его объектов за пределами методов performBlockAndWait: и performBlock: только в основном потоке. Поэтому, когда вы ставите в очередь свой блок для запуска в основной очереди, он гарантированно работает в основном потоке, и, следовательно, ваши данные безопасны.

Выполнение блока на основной нити не является атомарным. В противном случае, какова точка многопоточности? Для обеспечения безопасности данных вы должны использовать методы performBlockAndWait: и performBlock: при доступе к данным. Вам гарантировано, что запланированные блоки основной очереди будут работать без прерывания другими запланированными блоками главной очереди, а очереди контекста управляемых объектов (фоновые или основные) являются последовательными, поэтому только одному блоку будет разрешен одновременный доступ к данным.

+0

Как правило, сберегательный контекст происходит вместе с другими вещами следующим образом: (1) очистка контейнеров indexPath (2) сохранение контекста (3) callback NSFetchedResultedController будет вызван (4) контейнеры indexPath будут заполнены (5) вставка/удаление строк в tableView (6) очистка контейнеров indexPath снова - потому что мне нужен весь этот код в критическом разделе, который вы говорите: просто не отправляйте его в основной очереди с 'dispatch_sync', но используйте' performBlockAndWait', я правильно понял? –

+0

Предпочтительно, да. Не забудьте обновить интерфейс от этого блока. Sicne у вас есть выбранный контроллер результатов, и он привязан к контексту управляемого объекта главной очереди, он будет гарантировать, что вызывается в основном потоке, поэтому будет безопасно обновлять интерфейс. –

Смежные вопросы