通过多个步骤创建NSManagedObject实体的属性,并使用Core Data查看控制器

时间:2014-05-30 01:04:39

标签: ios objective-c core-data segue nsmanagedobject

如果我在每个视图控制器中创建一个实体的新片段(属性),然后再切换到下一个视图控制器以创建最终实体的另一个片段,我该如何将数据从每个视图控制器传递到最终视图控制器可以选择保存实体。

例如,我有一个由以下属性组成的实体:正文,日期,类别,照片和目标。在移动到下一个属性之前,每个属性都在单独的视图控制器中创建。我不知道在最终视图中我如何插入新的NSEntityDescription并将每个属性分配给从先前视图控制器收集的数据。将数据从一个vc传递到下一个vc的最佳方法是什么?从最终视图中的每个vc中提取信息?

1 个答案:

答案 0 :(得分:0)

你的方式是错误的(在我看来)。

你应该这样做:

  1. 创建一个新的托管上下文(主要类型)作为父项的子项:编辑上下文
  2. 在该上下文中插入新实体
  3. 将插入的实体引用和编辑上下文传递给构建对象的每个视图控制器
  4. 将更改直接应用于插入的对象
  5. 当用户完成后,保存编辑上下文(如果他取消,只需丢弃上下文并且不会造成任何伤害)。
  6. 如果您想将更改保留到商店,还要保存父上下文(等等到商店)
  7. 修改
    没有同一并发类型的父子语境的问题(在这种情况下是主要的)。

    您的" App Delegate"所需的更改(假设apple提供样板代码):

    - (NSManagedObjectContext *)managedObjectContext
    {
        if (_managedObjectContext != nil) {
            return _managedObjectContext;
        }
    
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (coordinator != nil) {
            _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
            [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        }
    
        return _managedObjectContext;
    }
    
    /**
    This will create a disposable context with main queue concurrency type.
    The disposable context will have the main context as parent.
    Pass this around view controllers while editing the same part of the object graph.
    */
    - (NSManagedObjectContext*) editingContext
    {
        NSManagedObjectContext* ctx = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        ctx.parentContext = self.managedObjectContext;
        return ctx;
    }
    

    您应该在委托的头文件中公开editingContext方法。

    保存(假设只有一个父语境):

    //get an editing context
    editingContext = [appDelegate editingContext];
    
    //pass this context to all editing views
    //when you are ready to save:
    
    NSError* error = nil;
    [editingContext save:&error];
    //check for errors
    [editingContext.parentContext save:&error];
    //check for errors