我想显示来自后端的数据所以让我们有一个示例json文件:
{
"fonts": [
{
"name": "Helvetica",
"styleIdentifier": "H0",
"size": 17
},
{
"name": "Helvetica",
"styleIdentifier": "H1",
"size": 14
},
{
"name": "Helvetica-Bold",
"styleIdentifier": "H0Bold",
"size": 17
},
{
"name": "HelveticaNeue-Light",
"styleIdentifier": "H0Light",
"size": 40
}
]
}
所以我创建了一个relationship
(很多 - ),并选择了ordered
选项。通过输入我看到它始终以相同的方式写入Core Data,但是当我尝试获取它时
configuratation.fonts
其中fonts
是NSOrderedSet
我按完全随机顺序获取项目。我想念某个规格?或者我应该以某种方式对其进行排序?
__ EDIT __
首先,当我从上面的json获取数据时,我有一个空字体关系的配置集。然后我获取它并将其插入到核心数据中:
NSMutableArray *returnArray = [NSMutableArray new];
for(NSDictionary *fontDictionary in jsonArray) {
Font *fontObj = [Font font:fontDictionary inContext:context];
[returnArray addObject:fontObj];
}
在此数组中数据的顺序正确。然后在配置对象中,我将其添加到NSOrderedSet
:
-(void)appendTracks:(NSArray<Font*>*)fontArray {
self.fonts = [NSOrderedSet orderedSetWithArray: fontArray];
}
然后我尝试通过简单地使用引用来获取它:
configuration.fonts
在此步骤中,数据完全不正确。
答案 0 :(得分:2)
不要直接设置NSOrderedSet。
修改现有的集合:
[self.fonts addObjectsFromArray:fontArray];
或者:
Xcode生成在生成的NSManagedObject
类中添加和删除有序集中的条目的方法。
假设您有Entity
名为ManagedConfiguration
,其中包含一个名为fonts
的有序到多个关系:
ManagedConfiguration *managedObjectConfigurationInstance = //create or fetch configuration in ManagedObjectContext
NSOrderedSet<ManagedFont> *fonts = //created or fetched fonts in wanted order
managedObjectConfigurationInstance.addToFonts(fonts)
replaceFonts
,removeFromFontsAtIndex
aso。方法也会产生。
根据您的要求,您可能希望以随机顺序存储字体,并将NSSortDescriptor
应用于NSFetchRequest
以按特定顺序获取数据。
答案 1 :(得分:1)
您需要先从fonts
子类中获取NSOrderedSet
的可变副本,而不是尝试将数据直接设置到您的属性(NSmanagedObject
)(我假设它为是Font
)。
NSMutableOrderedSet *orderedSet = [self mutableOrderedSetValueForKey:@"fonts"];
然后将数组中的对象添加到此orderedSet。
[orderedSet addObjectsFromArray:array];
现在您可以正确设置密钥fonts
的值。
所以你的appendTracks
函数现在看起来像这样。
-(void)appendTracks:(NSArray<Font*>*)fontArray {
NSMutableOrderedSet *orderedSet = [self mutableOrderedSetValueForKey:@"fonts"];
[orderedSet addObjectsFromArray:fontArray];
}
现在执行你的获取请求。您应该以数组中的设置顺序接收数据。
PS:我曾使用你的JSON响应来测试它。