Swift中CoreData FetchRequest自定义分组排序实现方案咨询
实现方案
可以直接对FetchedResults的查询结果做自定义处理实现需求,无需修改CoreData底层查询逻辑,仅需调整排序规则+分组两步即可完成。
步骤1:调整FetchRequest排序规则
优先在CoreData查询层确定排序优先级,比内存中排序效率更高,适配大数据量场景:
@FetchRequest( entity: User.entity(), // 先按姓氏升序,再按名字升序,查询结果本身就已经符合分组内的排序要求 sortDescriptors: [ NSSortDescriptor(keyPath: \User.lastname, ascending: true), NSSortDescriptor(keyPath: \User.firstname, ascending: true) ] ) var users: FetchedResults<User>
步骤2:对查询结果做分组处理
利用Swift标准库中Dictionary的init(grouping:by:)方法即可快速完成按姓氏首字母分组:
// 分组后的结果,key为姓氏首字母小写,value为对应用户数组 var groupedUsers: [String: [User]] { Dictionary(grouping: users) { user in // 取姓氏首字母转小写,异常情况兜底归到#分组 guard let firstChar = user.lastname.first else { return "#" } return firstChar.lowercased() } } // 如果需要输出你示例中的字符串结构,可再加一层转换 var groupedUserNames: [String: [String]] { groupedUsers.mapValues { users in users.map { "\($0.firstname) \($0.lastname)" } } } // 如果需要分组按字母序有序排列(比如用于UI的分组列表展示),可转成有序数组 var sortedGroupedUsers: [(key: String, value: [User])] { groupedUsers.sorted { $0.key < $1.key } }
补充说明
FetchedResults本身会实时同步CoreData的数据变化,基于它生成的分组结果也会自动同步更新,可直接配合SwiftUI的List、Section组件实现分组列表- 该方案兼容你现有业务逻辑,不需要修改CoreData的存储结构
内容的提问来源于stack exchange,提问作者Pinnokkio
相关产品推荐
相关产品推荐

