在我的应用中,我使用两个表视图绑定到每个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
类?
答案 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),我现在可以高兴地报告保存工作了!