如何使用NSPredicate将orderingLink为0的Core Data数据移至数组末尾
解决Core Data中orderingLink为0的数据移至数组末尾的问题
你的代码核心问题是添加了orderingLink != 0的谓词,直接过滤掉了目标数据,自然无法实现把0值条目移到末尾的需求。正确思路是保留所有数据,通过自定义排序规则让0值条目排在最后,具体修改如下:
修改后的代码
open func fetchLinkRequest(_ links: [Links]? = nil) -> NSFetchRequest<NSFetchRequestResult> { let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: T.entityName) // 第一个排序:强制让orderingLink为0的条目排在末尾 let zeroLastSort = NSSortDescriptor(key: "orderingLink", ascending: true, comparator: { obj1, obj2 in let val1 = obj1 as! Int64 let val2 = obj2 as! Int64 if val1 == 0 && val2 != 0 { return .orderedDescending } else if val1 != 0 && val2 == 0 { return .orderedAscending } else { return val1.compare(val2) } }) // 第二个排序:非0条目按orderingLink本身数值升序排列 let valueSort = NSSortDescriptor(key: "orderingLink", ascending: true) fetchRequest.sortDescriptors = [zeroLastSort, valueSort] // 移除过滤0值的谓词,保留所有数据;若有其他业务过滤逻辑可继续添加 var predicates = [NSPredicate]() // 示例:如果原本有和links参数相关的过滤需求,可在此补充 // if let links = links { ... } if !predicates.isEmpty { fetchRequest.predicate = NSCompoundPredicate(type: .and, subpredicates: predicates) } return fetchRequest }
关键说明
- 删除错误谓词:去掉
orderingLink != 0的过滤条件,确保所有数据都能被查询到 - 双层排序逻辑:第一层排序通过比较器区分0值和非0值,把非0值前置;第二层排序保证非0值内部按数值从小到大排列
- 兼容原有逻辑:如果
links参数原本对应其他过滤需求,可以继续保留相关谓词代码
内容的提问来源于stack exchange,提问作者Breno Vasconcellos
相关产品推荐
相关产品推荐

