Вы здесь смешиваются два совершенно разных понятия, но поскольку это основной поток/контекст/очередь, ваш микс маскируется, и он «работает».
Методы управляемого объекта контекста performBlockAndWait:
и performBlock:
не предоставляют никаких гарантий, по какому потоку выполняется этот блок, только безопасный доступ к данным, к которым осуществляется доступ/мутация. Поскольку ваш контекст имеет тип параллелизма основной очереди, это исключение состоит в том, что безопасно касаться его объектов за пределами методов performBlockAndWait:
и performBlock:
только в основном потоке. Поэтому, когда вы ставите в очередь свой блок для запуска в основной очереди, он гарантированно работает в основном потоке, и, следовательно, ваши данные безопасны.
Выполнение блока на основной нити не является атомарным. В противном случае, какова точка многопоточности? Для обеспечения безопасности данных вы должны использовать методы performBlockAndWait:
и performBlock:
при доступе к данным. Вам гарантировано, что запланированные блоки основной очереди будут работать без прерывания другими запланированными блоками главной очереди, а очереди контекста управляемых объектов (фоновые или основные) являются последовательными, поэтому только одному блоку будет разрешен одновременный доступ к данным.
Как правило, сберегательный контекст происходит вместе с другими вещами следующим образом: (1) очистка контейнеров indexPath (2) сохранение контекста (3) callback NSFetchedResultedController будет вызван (4) контейнеры indexPath будут заполнены (5) вставка/удаление строк в tableView (6) очистка контейнеров indexPath снова - потому что мне нужен весь этот код в критическом разделе, который вы говорите: просто не отправляйте его в основной очереди с 'dispatch_sync', но используйте' performBlockAndWait', я правильно понял? –
Предпочтительно, да. Не забудьте обновить интерфейс от этого блока. Sicne у вас есть выбранный контроллер результатов, и он привязан к контексту управляемого объекта главной очереди, он будет гарантировать, что вызывается в основном потоке, поэтому будет безопасно обновлять интерфейс. –