【问题标题】:Xcode - read a file containing NSDate objectsXcode - 读取包含 NSDate 对象的文件
【发布时间】:2014-03-26 11:07:38
【问题描述】:

每次触发事件时,我的应用都会记录其日期:

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filename = [path stringByAppendingPathComponent:@"dates.dat"];

if (![[NSFileManager defaultManager] fileExistsAtPath:filename]) {
    [[NSFileManager defaultManager] createFileAtPath:filename
                                            contents:nil
                                          attributes:nil];
}

NSFileHandle *wHandle = [NSFileHandle fileHandleForWritingAtPath:filename];
[wHandle seekToEndOfFile];

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[NSDate date]];

[wHandle writeData:data];

[wHandle closeFile];

我成功记录了事件的日期。但现在我在读回它们时遇到了麻烦。我试过了,但应用程序崩溃了:

NSData *restore = [NSData dataWithContentsOfFile:filename];
NSArray *date1 = [NSKeyedUnarchiver unarchiveObjectWithData:restore]; // crash here!

我注意到每次 NSDate 写入需要 223 个字节,但官方并未提及。所以我担心使用223字节作为长度来解析文件“dates.dat”会导致以后出现问题。

您是否有任何想法将 dates.dat 读入 NSArray 以便我可以继续其值?

提前致谢

【问题讨论】:

    标签: nsdate data-storage nskeyedarchiver nskeyedunarchiver


    【解决方案1】:

    不要将日期作为任意数据块存储在文件中(因为您是正确的,您不应该依赖每个日期使用的字节数)。

    至少使用分隔符(如回车),以便您知道哪些数据属于每个不同的日期。然后,您需要在尝试取消归档之前解析文件并仅读取适当的数据。

    【讨论】:

    • 谢谢,韦恩。我确实想过将每个 [NSDate date] 转换为 NSString 然后继续,但我只是想知道是否有更优雅的解决方案。
    • 存储为时间间隔数字或NSData 比字符串更好(格式化和解析问题)。但是您的问题完全在于您对多个日期的处理-这就是您需要组织的。文件中每行一个日期应该可以工作,逗号分隔也应该有效。你有几个约会?你用它们做什么?你只需要恢复最后一个吗?需要考虑这些事情才能知道更优雅的解决方案是什么样的......
    • 我决定将 NSDate 对象转换为纪元时间,整数;然后写入文件并恢复它们以进行处理,我认为这是目前最简单的解决方案。
    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多