Я использую Apple concurrency отладчик основных данных.
-com.apple.CoreData.ConcurrencyDebug 1
Время от времени я получил __Multithreading_Violation_AllThatIsLeftToUsIsHonor__
, даже я почти уверен, что нить не нарушена.
Это часть кода, в котором происходит исключение (код является частью протокола, который расширяет NSManagedObject):
public static func find(arrayBy predicate: NSPredicate, sort: [NSSortDescriptor] = [], limit: Int? = nil) -> [Self] {
let fetchRequest = NSFetchRequest<Self>(entityName: "\(Self.self)")
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sort
do {
return try Context.current.fetch(fetchRequest) // Exception!!!
} catch let error {
Logger.fatal("Failed to perform fetch: \(error)")
return []
}
}
Код выполняется в контексте блока perform:
.
Вот информация о потоках:
и информацию об отладчике, чтобы подтвердить, что выполнение выполняется в правом NSManagedContext:
(lldb) po Context.current
<StoreContext: 0x7f854b556610>
Имя объекта успешно извлечено:
po fetchRequest.entityName!
"Position"
Предикат построен из чистых объектов String (никаких управляемых объектов вообще не используется):
(lldb) po fetchRequest.predicate!
ANY employees.company.id == "282372"
В этом случае дескрипторы сортировки вообще не используются:
po fetchRequest.sortDescriptors!
0 elements
Предел полностью игнорируется.
Что мне не хватает? Кто-нибудь знает, что здесь может быть не так?
Edit:
Чтобы уточнить, Context.current
устанавливается непосредственно перед отправкой блока:
Context.current = managedObjectContext
managedObjectContext.performAndWait {
//...
}
Вы можете увидеть на скриншоте, что Thread 13
работает на Queue: NSManagedObject 0x7f854b556610 (serial)
. Кроме того, когда возникает исключение Context.current
возвращает <StoreContext: 0x7f854b556610>
. Если посмотреть на адрес памяти, то он легко выполнит в правой очереди.