2014-03-26 27 views
1

每次事件被觸發時,我的應用程序記錄了日期:的Xcode - 讀取包含的NSDate一個文件對象

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! 

我注意到,它需要223個字節爲每個NSDate的寫,但沒有被正式提及。所以恐怕使用223個字節作爲解析文件「dates.dat」的長度會在稍後導致問題。

你有什麼想法將dates.dat讀入NSArray,這樣我就可以繼續它的值了嗎?

在此先感謝

回答

1

不要存放日期爲文件數據的任意塊(因爲你是正確的,你不應該依賴於用於每個日期的字節數)。

作爲最低限度,使用分隔符(如回車),以便知道哪些數據屬於每個不同的日期。然後,您需要解析該文件,並在嘗試將其取消歸檔之前僅讀取適當的數據。

+0

謝謝,Wain。我曾考慮將每個[NSDate日期]轉換爲NSString,然後繼續,但我只是想知道是否有更優雅的解決方案。 – quanguyen

+0

以時間間隔編號或'NSData'存儲比字符串(格式化和解析問題)要好。但是你的問題是你處理多個日期 - 這就是你需要組織的。文件中的每行一個日期應該起作用,逗號分隔。你有多少日期?你用它們做什麼?你只需要恢復最後一個?這些東西需要考慮知道什麼更優雅的解決方案看起來像... – Wain

+0

我決定將NSDate對象轉換爲時代,整數;然後寫入文件並恢復它們進行處理,我相信現在是最簡單的解決方案。 – quanguyen

相關問題