保存parentContext

时间:2016-02-11 21:21:07

标签: ios core-data exc-bad-access

好吧,我有一段代码可以查询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

我遇到了实际上没有问题的情况,但大多数情况下,我得到了上面提到的错误。

任何想法都会受到欢迎!

1 个答案:

答案 0 :(得分:0)

嗯,事实证明问题是因为我有一个以“new”开头的Core Data属性。我改变了我的财产的名称,一切都是固定的。

所有解释如下:[CFString release]: message sent to deallocated instance