此示例说明如何使用 coreData 异步提取数据。如果您在没有方案“-com.apple.CoreData.ConcurrencyDebug 1”的情况下运行程序所有工作,但如果您打开方案“-com.apple.CoreData.ConcurrencyDebug 1”我们会得到运行时错误。为什么会发生这种情况我不知道
(我没有违反这些条款)来自苹果文档
Core Data 被设计为在多线程环境中工作。然而,并不是 Core Data 框架下的每个对象都是线程安全的。要在多线程环境中使用 Core Data,请确保:
托管对象上下文绑定到它们在初始化时关联的线程(队列)。
从上下文中检索的托管对象绑定到上下文所绑定的同一个队列。
Stack Trace
CoreData`+[NSManagedObjectContext __Multithreading_Violation_AllThatIsLeftToUsIsHonor__]:
0x7fff23a8a65e <+0>: pushq %rbp
0x7fff23a8a65f <+1>: movq %rsp, %rbp
-> 0x7fff23a8a662 <+4>: ud2
override func viewDidLoad() {
super.viewDidLoad()
do {
let batchResult = try coreDataStack.managedContext.execute(batchUpdate) as! NSBatchUpdateResult
print("Records updated \(batchResult.result!)")
} catch let error as NSError {
print("Could not update \(error), \(error.userInfo)")
}
let venueFetchRequest: NSFetchRequest<Venue> = Venue.fetchRequest()
fetchRequest = venueFetchRequest
asyncFetchRequest = NSAsynchronousFetchRequest<Venue>(fetchRequest: venueFetchRequest) {
[unowned self] (result: NSAsynchronousFetchResult) in
guard let venues = result.finalResult else {
return
}
self.venues = venues
self.tableView.reloadData()
}
do {
guard let asyncFetchRequest = asyncFetchRequest else {
return
}
try coreDataStack.managedContext.execute(asyncFetchRequest)
// Returns immediately, cancel here if you want
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
}