Mac OSX - 未存储核心数据

时间:2015-05-04 14:43:57

标签: ios macos swift core-data nsarraycontroller

在我的应用中,我使用两个表视图绑定到每个NSArrayController,并且数组控制器设置为使用核心数据实体。生成数据时,会创建NSObject,并使用obj.setValue(_:forKey:)将值存储在其中。在此之后,只需将对象添加到具有ac.addObject()的数组控制器。

这不足以让Core Data负责持久存储数据吗?

在任何情况下,如果我尝试通过调用saveAction()来保存数据,它会告诉我MOC没有更改(moc.hasChanges = false),因此它甚至没有开始使用此方法保存数据。

我还需要做些什么来使Core Data正确存储数据并确认更改?

数组控制器在Interface Builder中设置如下:

  • 模式:实体名称
  • 实体名称:'数据模型中的实体名称'
  • 检查准备内容

它们也正确绑定到托管对象上下文。

我应用中的简化相关代码:

    /* Clear existing data. */
    let range:NSRange = NSMakeRange(0, arrayController.arrangedObjects.count);
    let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
    arrayController.removeObjectsAtArrangedObjectIndexes(indexSet);

    let array = generateData();

    /* Generate data. */
    for i in 0 ..< array.count
    {
        let data = array[i];

        /* Create new data object. */
        var obj:NSObject = arrayController.newObject() as! NSObject;
        obj.setValue(data.name, forKey: "name");
        obj.setValue(data.type, forKey: "type");
        obj.setValue(data.category, forKey: "category");

        /* Add it to the array controller's contentArray. */
        arrayController.addObject(obj);
    }

更新:

看起来我的应用程序在启动时会实例化四个MOC。我怀疑我在两个阵列控制器的故事板中添加它们的方式是错误的。我向两个表视图控制器(也包含它们的数组控制器)添加了一个NSObject,并将它们的基类设置为我的CoreDataDelegate(这是我的核心数据代码类,通常在AppDelegate )。我怀疑这是创建CoreDataDelegate的多个实例的地方。问题是:我应该如何做到这一点,以便阵列控制器可以到达我的CoreDataDelegate类?

1 个答案:

答案 0 :(得分:0)

我使我的核心数据委托类成为Singleton,它为我解决了这个问题......

class CoreDataDelegate : NSObject
{
    static let instance = CoreDataDelegate();
    ...
}

然后我在AppDelegate中引用了它(也是一个单例)......

@NSApplicationMain
class AppDelegate : NSObject, NSApplicationDelegate
{
    static let instance = AppDelegate();
    let coreData:CoreDataDelegate;

    override init()
    {
        coreData = CoreDataDelegate.instance;
        super.init();
    }

    ...
}

然后在故事板中,我向我的两个表视图控制器添加了一个NSObject,并将基类设置为AppDelegate。然后通过AppDelegate / coreData.moc将ArrayControllers绑定到moc。

现在只创建了一个CoreDataDelegate实例(因此只有一个moc),我现在可以高兴地报告保存工作了!