【问题标题】: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 习惯用法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 2021-11-02
      • 1970-01-01
      • 2013-12-07
      相关资源
      最近更新 更多