Здесь вы смешиваете две совершенно разные концепции, но, поскольку это основной поток/контекст/очередь, ваш микс замаскирован и «работает».
Методы performBlockAndWait:
и performBlock:
контекста управляемого объекта не дают никаких гарантий, в каком потоке выполняется блок, только безопасный доступ к данным, к которым осуществляется доступ/мутация. Поскольку ваш контекст относится к типу параллелизма основной очереди, это исключение в том, что безопасно касаться его объектов вне методов performBlockAndWait:
и performBlock:
, только в основном потоке. Поэтому, когда вы ставите свой блок в очередь для запуска в основной очереди, он гарантированно запускается в основном потоке, и, таким образом, ваши данные в безопасности.
Выполнение блока в основном потоке не является атомарным. Иначе какой смысл в многопоточности? Чтобы обеспечить безопасность данных, вы должны вызывать методы performBlockAndWait:
и performBlock:
при доступе к данным. Вам гарантируется, что запланированные блоки основной очереди будут выполняться без прерывания другими запланированными блоками основной очереди, а очереди контекста управляемого объекта (фоновые или основные) являются последовательными, поэтому только одному блоку будет разрешен одновременный доступ к данным.
person
Leo Natan
schedule
12.05.2015