核心数据保存问题:无法更新可转换属性(NSArray)

aka*_*kyy 5 iphone core-data nsmanagedobject ios

我的核心数据应用程序中有一个奇怪的问题.

我的应用程序中有三个实体,但今天我发现其中一个实体存在问题.我的有问题的实体被调用Invoice,它有许多属性,包括Products.它编码NSDrray的NSArray(通过默认的NSValueTransformer).

一切正常 - 我创建我的发票,客户,产品等.一切正常.

但是,当我从列表中选择发票然后尝试编辑其产品并单击"保存"按钮时,我的保存仅在我的应用程序终止之前有效.

问题只出在我的products阵列上 - 其余的(例如付款日期,客户等)保存.


我在做什么

我通过我的Invoice对象

NSManagedObject *inv = [self.fetchedResultsController objectAtIndexPath:indexPath];
invoiceEditor.invoice = inv;
Run Code Online (Sandbox Code Playgroud)

并保存我的数据(在我的InvoiceEditorVC中):

[self.invoice setValue:client forKey:@"Client"] // NSDictionary;
[self.invoice setValue:products forKey:@"Products"] // NSArray of NSDictionaries;
[self.invoice setValue:pmDate forKey:@"PaymentDate"] // NSDate;
// other attributes
NSManagedObjectContext *context = self.invoice.managedObjectContext;
NSError *error = nil;
if (![context save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
Run Code Online (Sandbox Code Playgroud)

Everythings一直保存到终止:客户,产品,日期.但只有产品在终止后才会"重置".

任何人?

aka*_*kyy 4

刚刚发现问题了。来自模型对象实现指南

\n\n
\n

如果用于表示属性\xe2\x80\x94的类有可变和不可变版本,例如 NSArray 和 NSMutableArray\xe2\x80\x94,则通常应该将 get 访问器的返回值声明为不可变对象,即使在内部模型使用可变对象。

\n
\n\n

我的products数组实际上是一个NSMutableArray实例。我通过复制解决了这个问题products(所以我将可变数组转换为不可变数组)。现在可以了。:) 而且我不需要开始赏金......

\n