【发布时间】:2017-03-01 00:24:07
【问题描述】:
我经历了很多关于 CoreData 的讨论和主题,但我一直遇到同样的问题。
这里是上下文:我有一个应用程序必须对 CoreData 进行多次访问。为了简化,我决定声明一个 serial 线程专门用于访问(queue.sync 用于获取,queue.async 用于保存)。我有一个嵌套三次的结构,为了重新创建整个结构,我获取 subSubObject,然后是 SubObject,最后是 Object
但有时(如“对象”的 1/5000 再现)CoreData 在获取结果时崩溃,没有堆栈跟踪,没有崩溃日志,只有一个 EXC_BAD_ACCESS(代码 1)
对象不是原因,而且崩溃很奇怪,因为所有访问都是在 同一个线程中完成的,这是一个 串行线程
如果有人可以帮助我,我将非常感激!
代码结构如下:
private let delegate:AppDelegate
private let context:NSManagedObjectContext
private let queue:DispatchQueue
override init() {
self.delegate = (UIApplication.shared.delegate as! AppDelegate)
self.context = self.delegate.persistentContainer.viewContext
self.queue = DispatchQueue(label: "aLabel", qos: DispatchQoS.utility)
super.init()
}
(...)
public func loadObject(withID ID: Int)->Object? {
var object:Object? = nil
self.queue.sync {
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Name")
fetchRequest.predicate = NSPredicate(format: "id == %@", NSNumber(value: ID))
do {
var data:[NSManagedObject]
// CRASH HERE ########################
try data = context.fetch(fetchRequest)
// ###################################
if (data.first != nil) {
let subObjects:[Object] = loadSubObjects(forID: ID)
// Task creating "object"
}
} catch let error as NSError {
print("CoreData : \(error), \(error.userInfo)")
}
}
return object
}
private func loadSubObjects(forID ID: Int)->[Object] {
var objects:[Object] = nil
self.queue.sync {
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Name")
fetchRequest.predicate = NSPredicate(format: "id == %@", NSNumber(value: ID))
do {
var data:[NSManagedObject]
// OR HERE ###########################
try data = context.fetch(fetchRequest)
// ###################################
if (data.first != nil) {
let subSubObjects:[Object] = loadSubObjects(forID: ID)
// Task creating "objects"
}
} catch let error as NSError {
print("CoreData : \(error), \(error.userInfo)")
}
}
return objects
}
(etc...)
【问题讨论】:
-
在副本中查看我的答案。你不应该为 Core Data 使用自定义线程。您可以将其添加到您的项目中,以了解您将来何时违反线程:stackoverflow.com/questions/31391838/…
标签: ios swift xcode core-data thread-safety