print("queue1: \(NSOperationQueue.currentQueue())")
managedObjectContext.performBlockAndWait({
print("queue2: \(NSOperationQueue.currentQueue())")
})
и выходе:NSManagedObjectContext.performBlockAndWait() запускает блок на основной нити/очереди
queue1: Optional(<NSOperationQueue: 0x7fa31c030cf0>{name = 'NSOperationQueue 0x7fa31c030cf0'})
queue2: Optional(<NSOperationQueue: 0x7fa319d114d0>{name = 'NSOperationQueue Main Queue'})
Так, performBlockAndWait
запускает блок в основном потоке. Не знаете, почему? Является ли это ожидаемым поведением?
Таким образом, любые решения проблем:
- мне нужно запустить код блока в фоновом режиме, иначе она замерзает UI. Итак, как я могу ?, или
- Если я не использую
performBlockAndWait
код в аварийном завершении блока с описаниемTerminating app due to uncaught exception NSInvalidArgumentException, reason _referenceData64 only defined for abstract class
. Любая альтернатива?
Весь смысл 'performBlockAndWait' ** является то, что он ждет **. Даже если он управляет блоком в другом потоке, код, который вызывает 'performBlockAndWait', все еще будет ** ждать ** до тех пор, пока блок не закончится - это означает, что ваш пользовательский интерфейс ** все равно ** перестанет отвечать на запросы во время его выполнения. –