Swift下使用Core Data按名称末尾序号对条目顺序排序的实现问题
解决方案
原代码的普通字符串排序存在逻辑缺陷:例如
Part 10会排在Part 2前面,因为字符串排序是逐字符比较ASCII值,字符1的ASCII值小于2,不会识别为整体数字。
方案1(推荐):新增专用排序字段
该方案性能最优,尤其适合数据量较大的生产场景:
- 给
DisplayHelperCore Data模型新增整数类型属性partIndex,专门存储条目名称末尾的序号 - 保存条目数据时,提前解析名称末尾的数字存入
partIndex字段 - 调整查询代码的排序描述符即可:
let request : NSFetchRequest<DisplayHelper> = DisplayHelper.fetchRequest() print("type set is : \(type)") let predicate = NSPredicate(format: "type == %@", type) request.predicate = predicate // 替换为按序号字段升序排序 let sortDescriptor = NSSortDescriptor(key: "partIndex", ascending: true) request.sortDescriptors = [sortDescriptor]
方案2:无模型修改权限时,内存排序实现
如果无法修改现有Core Data模型结构,可以先拉取全量符合条件的数据,再在内存中按规则自定义排序:
let request : NSFetchRequest<DisplayHelper> = DisplayHelper.fetchRequest() print("type set is : \(type)") let predicate = NSPredicate(format: "type == %@", type) request.predicate = predicate do { let rawResults = try context.fetch(request) // 内存自定义排序:提取名称末尾数字比较 let sortedResults = rawResults.sorted { item1, item2 in let num1 = Int(item1.name.components(separatedBy: .whitespaces).last ?? "0") ?? 0 let num2 = Int(item2.name.components(separatedBy: .whitespaces).last ?? "0") ?? 0 return num1 < num2 } // 后续直接使用排序后的sortedResults } catch { print("数据查询失败: \(error)") }
内容的提问来源于stack exchange,提问作者Clean Coder
相关产品推荐
相关产品推荐

