Objective-C自定义类FileModel按NSDate排序失效问题
问题分析:FileModel按editDate排序未生效的原因及解决办法
嘿,我一眼就瞅见你代码里的问题啦!你的排序逻辑犯了个超容易疏忽的小错误,直接导致排序完全没按预期工作。
核心错误点
在你写的sortedArrayUsingComparator排序block里,获取第二个对比日期的时候,错误地重复取了对象a的editDate,而不是对象b的!看这段有问题的代码:
NSDate *first = [(FileModel*)a editDate]; NSDate *second = [(FileModel*)a editDate]; // 这里应该用b,不是a!
因为你拿同一个对象的日期和自己比较,每次返回的都是NSOrderedSame(相等),数组自然不会有任何排序变化,只会保持原本的添加顺序。
修正后的代码
把second的来源改成b就搞定了!另外,你想要的是倒序排列(最新的日期在前),当前的[second compare:first]逻辑是对的;如果需要正序(最早的日期在前),就换成[first compare:second]。修正后的完整排序代码如下:
sortedArray = [fileData sortedArrayUsingComparator:^NSComparisonResult(FileModel *a, FileModel *b) { NSDate *first = a.editDate; // 参数已经是FileModel类型,不用强制转换,直接用属性更简洁 NSDate *second = b.editDate; return [second compare:first]; // 倒序,最新日期的FileModel排在最前面 }];
额外说明
你在循环里用[NSThread sleepForTimeInterval:1]生成不同editDate的方法是没问题的,每个FileModel的日期确实会依次晚1秒。修正之后,排序结果就会完全符合你的预期:avocado.png -> grape.png -> durian.png -> cherry.png -> banana.png -> apple.png——毕竟avocado是最后添加的,日期最新,会排在最前面。
内容的提问来源于stack exchange,提问作者dickfala
相关产品推荐
相关产品推荐

