iOS中的自定义排序,希望在Coredata的顶部显示默认(所有组)标题
Posted
技术标签:
【中文标题】iOS中的自定义排序,希望在Coredata的顶部显示默认(所有组)标题【英文标题】:Custom sort in iOS, want to show default(All Group) title on top from Coredata 【发布时间】:2017-06-07 10:59:33 【问题描述】:我正在使用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"]
【问题讨论】:
不要在数据模型中解决这个问题,而是在TableViewDataSource中手动添加静态单元格。所以索引 0 处的对象是你All groups
单元格,只要记住在从 FetchedresultsController
抓取项目时从索引中减去 1。
谢谢。现在,我只是在工作。您如何看待@jonRose 的回答?哪个好,比如效率、速度等,
正如我之前提到的,All group
是静态的ID
,现在我添加了 NSPredicate *allGroupPredicate = [NSPredicate predicateWithFormat:@"%K != %d", NSStringFromSelector(@selector(assetGroupID)), allUserGroupID];
并以此为谓词。在cellForRowAtIndexPath
上为All group
设置静态单元格。这就是你想要表达的意思吗?
【参考方案1】:
你和我都知道'All group'是特殊的,因为我们读懂了这个词,但核心数据无法知道'All group'是特殊的;它所看到的一切都是以“A”开头的。您可以将另一个属性添加到您的实体isAllGroup
并首先按此排序,然后按assetGroupName
。
或者您可以拥有一个属性“groupOrder”,对于“所有组”,该属性为 0,对于所有其他组,该属性为 100。这让您有更多空间来进行其他特殊团体订购,而无需创建新属性。
更通用的方法是添加属性assetGroupNameForSort
并按其排序,而不是仅用于显示的assetGroupName
。对于大多数组,值是相同的,但对于“All Group”,它是“__All Group”或类似的东西。这也可用于修复使用不同语言的名称可能发生的问题,这些名称以您不期望的方式排序。
我会推荐第一种方法,只需添加一个“isAllGroup”属性。是最简单的,数据也很容易理解。
另外:小问题 - fetchedResultsController 不尊重 FetchBatchSize,因此您可以将其删除。
【讨论】:
感谢您指出小问题。你能解释一下为什么吗?因为FetchBatchSize
也是获取结果的一部分意味着NSFetchRequest
。
我不想为这个小改动更新(或版本控制)数据库。所以我要添加另一个AND
谓词NSPredicate *allGroupPredicate = [NSPredicate predicateWithFormat:@"%K != %d", NSStringFromSelector(@selector(assetGroupID)), allUserGroupID];
。开启cellForRowAtIndexPath
为All group
设置静态单元格。再次感谢您提供更多排序选项。
如果 fetchedResultsController 尊重 batchSize,因为苹果没有写它尊重 batchSize。我猜他们这样做是因为它会给代码增加大量的复杂性。例如,如果有插入,它也会导致删除(因为它超过了 batchSize)。
我认为你不应该害怕版本模型。即使是很小的变化,我也会一直这样做。
再次感谢您的解释。以前我没有尝试过版本模型。这就是为什么。好的,让我给版本模型一个镜头。 (心声)在功能上,苹果可能会考虑这种排序方式。小分类的东西,但很少手动工作。以上是关于iOS中的自定义排序,希望在Coredata的顶部显示默认(所有组)标题的主要内容,如果未能解决你的问题,请参考以下文章
IOS:将viewcontroller添加到ios中的自定义TabBar