好吧,我有一段代码可以查询CoreData中的实体,循环遍历所有内容,处理数据,将其附加到数组然后删除CoreData对象。
保存当前上下文的工作正常,但在parentContext
上调用save会给我一个EXC_BAD_ACCESS
错误。
这是我的代码:
在我的init方法中:
managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
managedObjectContext.parentContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
基本上取主managedObjectContext
并将其设为我的parentContext
。到目前为止,没问题。
managedObjectContext.performBlock({ () -> Void in
do {
let fetchRequest = NSFetchRequest(entityName: "Changes")
fetchRequest.predicate = NSPredicate(format: "id BEGINSWITH[c] %@", idPrefix)
if let changes = try self.managedObjectContext.executeFetchRequest(fetchRequest) as? [Changes] {
for change in changes {
let json = change.json!
let newJson = change.newJson!
let changeId = change.id!
self.managedObjectContext.deleteObject(change)
let deserializedJson = try NSJSONSerialization.JSONObjectWithData(json.dataUsingEncoding(NSUTF8StringEncoding)!, options: [])
let deserializedNewJson = try NSJSONSerialization.JSONObjectWithData(newJson.dataUsingEncoding(NSUTF8StringEncoding)!, options: [])
updates.append([
"Id": changeId,
"NewJson": deserializedNewJson,
"Json": deserializedJson
])
}
try self.managedObjectContext.save()
dispatch_async(dispatch_get_main_queue(), { () -> Void in
do {
try self.managedObjectContext.parentContext?.save()
}
catch {
completionHandler(error: error as NSError)
}
})
}
}
catch {
completionHandler(error: error as NSError)
}
})
我已启用NSZombies
以查看我可以获得更多相关信息。当我尝试在主线程上执行parentContext
的保存时,出现以下错误:
*** -[CFString release]: message sent to deallocated instance 0x1579a0570
我遇到了实际上没有问题的情况,但大多数情况下,我得到了上面提到的错误。
任何想法都会受到欢迎!
答案 0 :(得分:0)
嗯,事实证明问题是因为我有一个以“new”开头的Core Data属性。我改变了我的财产的名称,一切都是固定的。
所有解释如下:[CFString release]: message sent to deallocated instance