创建简单的代码以从CoreData获取数据后,我意识到会触发一些未知错误。我读到在后台获取数据并不那么简单。不幸的是,我是iOS开发的新手,只知道Swift,那里有许多Objective-C教程。 这是我的代码:
func reloadData() {
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Person")
do {
let results = try managedContext.executeFetchRequest(fetchRequest)
let people = results as! [NSManagedObject]
for person in people {
collectionViewData.append(person)
}
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
dispatch_async(dispatch_get_main_queue()) {
self.collectionView?.reloadData()
}
}
}
如何使用NSPrivateQueueConcurrencyType和Swift中的类似实现?
答案 0 :(得分:1)
您的代码几乎肯定会失败。您正在从后台线程访问主要托管对象上下文。
从您的代码中看来,您似乎不需要后台获取。删除代码中的所有GCD(大中心调度)部分,你应该没问题。
供参考,这是您在Core Data中执行后台操作的方法:
let moc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
moc.parentContext = <insert main context here>
moc.performBlock {
// make changes, fetch, save
}
保存后,您的主要上下文将进行更改。要更新表视图,请实现NSFetchedResultsController
及其委托方法以自动执行此操作。