来自服务器和核心数据的NSOrderedSet响应

时间:2016-10-28 10:45:44

标签: ios objective-c core-data

我想显示来自后端的数据所以让我们有一个示例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其中fontsNSOrderedSet我按完全随机顺序获取项目。我想念某个规格?或者我应该以某种方式对其进行排序?

__ 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

在此步骤中,数据完全不正确。

2 个答案:

答案 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)

replaceFontsremoveFromFontsAtIndex 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响应来测试它。