iOS中的自定义排序,希望在Coredata

时间:2017-06-07 10:59:33

标签: ios core-data nsfetchedresultscontroller nssortdescriptor

我正在使用核心数据NSFetchedResultController。在这种情况下,我有n个用户组,用户可以选择特定组或选择all group。因此,我手动将All group标题,static ID和相关内容添加到数据库中。

NSFetchRequest <IRSUserAssetGroup *> *fetchRequest = [NSFetchRequest fetchRequestWithEntityName: [IRSUserAssetGroup entityName]];

NSSortDescriptor *nameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey: NSStringFromSelector(@selector(assetGroupName))
                                                                     ascending: YES
                                                                      selector: @selector(localizedCaseInsensitiveCompare:)];

[fetchRequest setSortDescriptors: @[nameSortDescriptor]];

[fetchRequest setFetchBatchSize: 4];

NSManagedObjectContext *mainContext = [[IRSCoreDataManager sharedManager] managedObjectContext];

NSFetchedResultsController <IRSUserAssetGroup *> *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest
                                                                                                                 managedObjectContext: mainContext
                                                                                                                   sectionNameKeyPath: nil
                                                                                                                            cacheName: nil];

NSError *fetchError = nil;

if (![fetchedResultsController performFetch: &fetchError])
    FCALog(@"fetch error: %@", fetchError);

[self setUserAssetGroupFetchedResultsController: fetchedResultsController];

这是我的FRC代码。我正在使用按名称排序。某些组名称以数字开头。因为这个All group不在第一位。

这可能All group总是排在最前面吗?

额外:我正在使用带有搜索选项

的表格视图

示例:@[@1, @5, @"text", @"aaaaaaa", @"All group"]。此处All group始终显示在列表顶部。我怎么能这样排序呢。

输出:@[@"All group", @1, @5, @"aaaaaaa", @"text"]

1 个答案:

答案 0 :(得分:0)

你和我知道&#39;所有小组&#39;是特别的,因为我们阅读并理解了这个词,但是核心数据无法知道&#39; All group&#39;很特别;所有它都认为它以&#34; A&#34;开头。您可以向实体isAllGroup添加另一个属性,然后按其排序,然后按assetGroupName排序。

或者你可以拥有一个属性&#39; groupOrder&#39;对于&#34;所有组&#34;为0每个其他团体100个。这样您就可以有更多空间在不创建新属性的情况下进行其他特殊组排序。

更通用的方法是添加属性assetGroupNameForSort并按其排序,而不是仅用于显示的assetGroupName。对于大多数组,值是相同的,但对于&#34;所有组&#34;它是&#34; __ All Group&#34;或类似的东西。这也可以用于修复可能发生的问题,这些问题可能会出现在不同语言中的名称,这些名称会以您不希望的方式排序。

我会推荐第一种方法,只需添加&#39; isAllGroup&#39;属性。这是最简单的,数据很容易理解。

另外:次要问题 - fetchedResultsController不尊重FetchBatchSize,因此您可以删除它。