我正在从核心数据存储中读取一堆对象,当我试图在代码的后期部分从该数组中读取对象时Xcode断言该语句上的错误线程访问。我在方案中添加了-com.apple.CoreData.ConcurrencyDebug 1标志,以找出与核心数据并发相关的问题。当我删除此标志时,一切正常。
以下是我从核心数据存储中读取数据的方法
let managedContext =
appDelegate.persistentContainer.newBackgroundContext()
//setup request to load persons ( cached contacts)
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "Person")
fetchRequest.fetchBatchSize = 20
//read entties
managedContext.performAndWait {
do {
self.people = try managedContext.fetch(fetchRequest)
print("\(self.people.count) contacts retrieved from cache(CD)" )
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
}
我正在从代码的其他部分读取数组,如下所示
let tempContact = self.people[index]
var property = tempContact.value(forKey: "firstName") as! String
我在上面的第二行得到断言。上面的代码位于我尝试调用的函数中,如下所示
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let moc = appDelegate.persistentContainer.viewContext
let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
privateMOC.parent = moc
privateMOC.perform {
self.updateChangedContacts()
}
self.contactsTableView.reloadData()
如果我直接调用updateChangedContacts它可以正常工作,但如果我有大量的联系人,这个操作将占用很长时间阻止主UI。
我想避免这种情况,我该如何处理?