【发布时间】:2015-08-12 14:23:46
【问题描述】:
我知道关于核心数据和关系的问题经常发生,但我保证这个问题不一样 :)
我有两个表,一个“Job”表和一个“Scheme”表。
应用加载时会填充方案表,到目前为止一切正常。
我知道,当我创建一个新的“作业”时,我需要获取正确的“方案”,然后将该方案附加到作业。
我的问题是,当 Fetch 发生时我已经在一个临时上下文中,它只会导致 nil 展开错误并摔倒,我认为这与我在操作已经执行时尝试执行 fetchRequest 有关等待我的 managedObjectContext...
这里有一些代码应该概述我所在的位置:
for (index, object) in obj {
let entityName = "Job"
var request = NSFetchRequest(entityName: entityName)
request.predicate = NSPredicate(format: "id = %@", object["id"].string!)
var error: NSError?
if let results = tempContext.executeFetchRequest(
request,
error: &error
) as? [NSManagedObject] {
if results.count != 0{
if let moc = self.managedObjectContext {
moc.performBlockAndWait({
for result in results {
self.refreshDataSet(result, object: object)
moc.save(nil)
}
})
}
}else{
if let moc = self.managedObjectContext {
moc.performBlockAndWait({
self.createJobData(object, moc: moc)
moc.save(nil)
})
}
}
}
}
所以,self.createJobData(object, moc: moc) 位内部是这样的:
func createJobData(object: JSON, moc: NSManagedObjectContext){
let work = NSEntityDescription.insertNewObjectForEntityForName("Work", inManagedObjectContext: moc) as! Work
let schemeEntity = "Scheme"
var request = NSFetchRequest(entityName: schemeEntity)
request.predicate = NSPredicate(format: "id = %@", object["schemeId"].string!)
self.managedObjectContext!.performBlock { () -> Void in
var error: NSError?
if let results = self.managedObjectContext!.executeFetchRequest(
request,
error: &error
) as? [Scheme] {
if results.count != 0{
for result in results{
println(result)
}
}
}
}
//....
}
这就是我感到困惑的地方,我尝试添加另一个 performBlock 但后来意识到这显然不是答案...
任何帮助将不胜感激:)
【问题讨论】:
-
您是否尝试过不使用块进行重构,只使用主线程托管对象上下文?