В моем приложении я использую два табличных представления, каждое из которых привязано к своему NSArrayController
, а контроллеры массива настроены на использование объектов Core Data. Когда данные генерируются, создается 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
?
NSObject
? Показать код - person Wain   schedule 04.05.2015