【问题标题】:How can I sort an icloud NSMetadataQuery result of UIDocument's by modification date?如何按修改日期对 UIDocument 的 icloud NSMetadataQuery 结果进行排序?
【发布时间】:2012-09-02 15:27:07
【问题描述】:
我有一个 iOS 应用程序,它使用一个简单的 UIDocument 模型和一个用于 iCloud 存储的内容字段。我检索文档列表以使用 NSMetadataQuery 填充 UITableView。我想让新文档出现在此表的顶部,但默认排序似乎是旧的 -> 新的。
我知道如果我在文档中有一个自定义日期字段,我可以使用该字段上的 NSSortDescriptor 对查询进行排序,但我的问题是是否可以按通过 UIDocument iCloud 存储创建的文件的内在修改日期进行排序?或者有其他首选方法吗?
【问题讨论】:
标签:
ios
icloud
uidocument
nsmetadataquery
【解决方案1】:
看起来正确的方法是在创建查询时设置查询的排序描述符。大致如下:
NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
[query setSearchScopes:[NSArray arrayWithObject:
NSMetadataQueryUbiquitousDocumentsScope]];
NSPredicate *pred = [NSPredicate predicateWithFormat: @"%K ENDSWITH '.bin'",
NSMetadataItemFSNameKey];
[query setPredicate:pred];
NSSortDescriptor *sortDescriptor =
[[[NSSortDescriptor alloc] initWithKey:NSMetadataItemFSContentChangeDateKey
ascending:FALSE] autorelease]; //means recent first
NSArray *sortDescriptors = [NSArray arrayWithObjects:
sortDescriptor,
nil];
[query setSortDescriptors:sortDescriptors];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(queryDidFinishGathering:)
name:NSMetadataQueryDidFinishGatheringNotification
object:query];
[query startQuery];
【解决方案2】:
要点:如何调用-[NSURL getResourceValue:forKey:error:] 并传入NSURLContentModificationDateKey,然后对返回的NSDate 值进行降序排序。
详细信息:您可以将比较器传递给-[NSMutableArray sortUsingComparator:],该比较器会即时为每个对象获取所需的 NSDate,或者将它们全部获取到具有复合 NSDate, id 对象的新数组中,然后对该数组进行排序对象,然后在完成排序时提取 id 引用(python decorate-sort-undecorate 习惯用法)。