斯威夫特&核心数据 - 将实体添加到现有实体

时间:2015-08-12 14:23:46

标签: ios swift core-data

我理解有关核心数据和关系的问题会发生很多,但我保证会有这样的不同:)

我有两张桌子,一张' Job'桌子和方案'表

应用程序加载时会填充方案表,到目前为止一切都很好。

我明白,当我创建一个新的“工作”时,我需要获取正确的方案'然后将该计划附加到工作中。

我的麻烦是,我是否已经在临时上下文中,而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,但后来意识到这显然不是答案......

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:3)

我建议在主线程上下文中执行所有操作。如果您不能这样做,请在相同背景上下文中执行所有操作。

如果您使用的是获取的结果控制器,它将为您执行查找。据推测,您的用户已选择一个Scheme,所以

let scheme = fetchedResultsController.objectAtIndexPath(indexPath) as! Scheme

使用相同的托管对象上下文:

let context = scheme.managedObjectContext // or get it from your Core Data stack
let newJob = NSEntityDescription.insertNewObjectForEntityForName(
                 "Job", inManagedObjectContext: context) as! Job 
newJob.scheme = scheme
do { try context.save() } catch { /*handle error */ }
相关问题