【发布时间】:2016-04-05 07:53:42
【问题描述】:
我的数据模型中有几个一对多关系。在每种情况下,从模型中检索到的数据的顺序与插入它的顺序相匹配是很重要的。我已经在检查器中为每个关系勾选了“有序”框。我添加数据如下:
NSMutableOrderedSet *set = [destinationEntity mutableOrderedSetValueForKey:relationshipKey];
[set addObject:sourceEntity];
[CoreDataFunctions saveEntity:destinationEntity];
我随后按如下方式检索该集合:
NSOrderedSet *set = [sourceEntity valueForKey:relationshipKey];
在添加数据的设备上,这可以正常工作 - 我可以添加多个实体,并且它们始终以正确的顺序显示。问题是在通过 iCloud 同步接收数据的设备上,该集合以不同的顺序返回。请注意始终相同的顺序,但与在原始设备上输入的顺序不同。
为了解决这个问题,我添加了一个“order”属性,当将对象插入集合时,该属性由递增的整数填充。然后,我可以在从数据模型中检索该集合后按该键对集合进行排序。但是,如果 NSOrderedSet 没有按可预测的顺序返回,我不禁会觉得有问题。
我想知道这是否与我在设备从 iCloud 接收交易时在日志中看到的一些错误有关。我多次看到以下内容,大概每笔交易一次:
*** 错误:这个进程调用了一个 NSArray-takeing 方法,例如 initWithArray:,并传入了一个 NSSet 对象。目前正在解决此问题,但很快就会让您感到悲伤。
我认为这是因为数据模型中的对象是 NSSet 类型,而 Core Data 将它们传递给期望 NSArray 的对象。但是,我不知道我能做些什么,或者它是否与这个问题有关。我假设是这样,因为我怀疑 Core Data 正在将 NSOrderedSet 转换为 NSArray 并在此过程中丢失排序。不过我无法确认。
感谢您的任何建议!
【问题讨论】:
标签: ios objective-c core-data nsset nsorderedset