【问题标题】:How to sort file from document directory by Created Date in iOS?如何在iOS中按创建日期对文档目录中的文件进行排序?
【发布时间】:2013-06-24 14:20:04
【问题描述】:

我有一个NSMutableArray,它从 iOS 的文档目录中检索了文件。

我使用以下代码从文档目录中检索文件。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSError * error;
    self.array = [[NSMutableArray alloc] init];

    self.array = (NSMutableArray *)[[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:&error];

然后我在UITableView 中显示文件列表。 但是它按字母顺序显示。

我想显示它按文件的创建日期排序。

编辑

这是我写的ViewWillAppear

- (void)viewWillAppear:(BOOL)animated
{   
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSError * error;
    self.array = [[NSMutableArray alloc] init];

    self.array = (NSMutableArray *)[[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:&error];

    [self loadData];  
 }

- (void) loadData
{
    self.sortedFileList = [self.array mutableCopy];
    [self.sortedFileList sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSDate* d1 = [[NSFileManager defaultManager] attributesOfFileSystemForPath:obj1 error:nil][@"fileCreationDate"];
        NSDate* d2 = [[NSFileManager defaultManager] attributesOfFileSystemForPath:obj2 error:nil][@"fileCreationDate"];
        return [d1 compare:d2];
    }];

}

而且它不按日期排序。

我该怎么做?

感谢您的任何建议和帮助。

【问题讨论】:

  • 您没有在此处提供完整的上下文,但我怀疑您在 cellForRowAtIndexPath 方法中执行此操作。不要那样做!您将为显示的每个单元格重新排序数组。
  • 是的,下面的代码是我在 cellForRowAtIndexPath 中编写的。你的意思是我需要重新排序数组中的每一行?
  • 您显示的代码将为表格中的每个单元格调用一次。这意味着您将为您显示的每个单元格检索和排序文件列表。如果该列表在调用之间因某种原因而不同,您最终可能会崩溃(索引超出范围等)。
  • 查看我的更新答案。

标签: ios objective-c cocoa-touch nsmutablearray nsdate


【解决方案1】:

您需要向我们NSFileManager 获取每个文件的属性 (attributesOfItemAtPath:error:)。这将返回文件的字典,您可以使用fileCreationDate 获取创建日期。然后你就可以进行排序了。

【讨论】:

    【解决方案2】:

    您可以做的一件事是将FileNames 存储为KeyCreationDate 作为Value 在某些NSDictionary 中,然后您可以使用...

    myArray = [myDict keysSortedByValueUsingComparator: ^NSComparisonResult(id obj1, id obj2){
                      return [[obj2 date] compare:[obj1 date]];
              }];
    

    【讨论】:

    • 您会将 creationDate 存储在什么类型中以要求 [obj2 date]?如果是NSDate,那么它会是return [obj2 compare:obj1];,不是吗?
    【解决方案3】:

    一种方法是在可变数组上使用sortUsingComparator: 方法,例如(伪代码):

    @property (nonatomic,retain) NSMutableArray* sortedFileList;
    ....
    
    // Make sure to call this method *once* (i.e. from your VC when loading view).
    - (void) loadData {
        self.sortedFileList = [self.array mutableCopy];
        [a sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            NSDate* d1 = [[NSFileManager defaultManager] attributesOfItemAtPath:obj1 error:nil][@"fileCreationDate"];
            NSDate* d2 = [[NSFileManager defaultManager] attributesOfItemAtPath:obj2 error:nil][@"fileCreationDate"];
            return [d1 compare:d2];            
        }];
    
    }
    
    - (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section     {
        return self.sortedFileList.count;
    }
    
    - (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell* cell = // dequeue cell or create one
    
    
    
        cell.textLabel.text = [[[NSString stringWithFormat:@"%@",[self.sortedFileList objectAtIndex:indexPath.row]] lastPathComponent] stringByDeletingPathExtension];
    }
    

    【讨论】:

    • 最好使用NSFileCreationDate 常量作为字典键。
    • 更新了答案以澄清。
    • 对不起兄弟。我写的代码和你的一样,排序不正确。 :(顺便说一句,非常感谢你。
    • 我不知道,记住这只是伪代码。我没有 ATM 运行 iOS 代码的可能性。要检查的事情是,如果您在应该排序后打印出数组,它真的排序了吗? attributesOfFileSystemForPath:obj2 error:nil][@"fileCreationDate"]; 是否返回有效的东西(我只是基于@Wain 的回答)?
    • 你为什么使用attributesOfFileSystemForPath
    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    相关资源
    最近更新 更多