可能重複:這裏
iOS store just a little bit of data在OS X/Cocoa中存儲數據的首選方法?
新的OS X開發。我有一小部分用戶數據需要存儲(實際上只是最近打開的文件的路徑)。在Cocoa土地上儲存這些東西的首選方式是什麼?我之前聽說過Core Data,但作爲一個Windows開發人員,他遇到過很多來自MS的API,有沒有人真的使用過這個?
當然,我可以把所有的東西都寫到我自己的文件中,但我更喜歡做正確的方式(TM)。
任何建議將是偉大的!
可能重複:這裏
iOS store just a little bit of data在OS X/Cocoa中存儲數據的首選方法?
新的OS X開發。我有一小部分用戶數據需要存儲(實際上只是最近打開的文件的路徑)。在Cocoa土地上儲存這些東西的首選方式是什麼?我之前聽說過Core Data,但作爲一個Windows開發人員,他遇到過很多來自MS的API,有沒有人真的使用過這個?
當然,我可以把所有的東西都寫到我自己的文件中,但我更喜歡做正確的方式(TM)。
任何建議將是偉大的!
如果您的應用程序是基於文檔的,則會自動爲您存儲最近打開的文件列表。如果你需要自己保存,那麼我會建議使用NSUserDefaults。這是存儲輕量級信息(如首選項和最近使用的項目)的最常見方式。
是的,人們確實使用核心數據,但它通常用於更復雜的數據,例如具有不同部分的文檔。
請參閱my answer到this thread五個關於存儲數據的建議。雖然該線程覆蓋iOS,因此Cocoa Touch代替Cocoa,但答案几乎相同。
請注意,第一個答案NSUserDefaults
用於保存應用偏好等數據。如果應用程序總是希望加載相同的一組數據,那麼這可能是最合適的;如果數據更像是一個文檔,那麼您可能會在不同的文件中存儲不同的數據集,您應該使用其他方法之一。寫一個屬性列表可能會是簡單的在這種情況下:
// store some words in an array and write to a file at pathToFile
NSMutableArray *array = [NSMutableArray array];
[array addObjects: @"foo", @"bar", @"baz", nil];
[array writeToFile:pathToFile];
// (later) read contents of the file at pathToFile into a new array
NSArray *words = [NSArray arrayWithContentsOfFile:pathToFile];
至於核心數據,是的,很多人使用它。這是管理持久對象的一種非常好的方式。但是,它聽起來像是存儲一堆路徑的方式。
正如ughoavgfhw提到的那樣,NSDocument
體系結構已經負責保留最近的文檔列表。 (如果您查看您的首選項文件夾,*.LSSharedFileList.plist
首選項文件保存此數據)。
如果您在Property List Editor或Xcode 4中查看這些文件,您將看到以持久方式存儲對文件的引用的首選方式是使用Alias(或「Bookmark」)數據。如果您來自Windows/* nix背景,別名數據可以跟蹤某個項目,即使它已被重命名或移動。
如果您需要自行存儲最近使用的文件列表,並且可能需要OS X 10.6+,則可以使用NSUserDefaults
以及NSURL
中的書籤數據功能。
在打開的文件你的方法,你可以做這樣的事情:
NSString * const MDRecentDocumentsKey = @"MDRecentDocuments";
- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames {
// assume single item
NSURL *URL = [NSURL fileURLWithPath:[filenames objectAtIndex:0]];
NSMutableArray *recentAppBookmarks =
[[[[NSUserDefaults standardUserDefaults] objectForKey:MDRecentDocumentsKey]
mutableCopy] autorelease];
// assume 20 item limit
if ([recentAppBookmarks count] + 1 > 20) {
[recentAppBookmarks removeLastObject];
}
NSData *data = [ bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil
relativeToURL:nil error:NULL];
[recentAppBookmarks insertObject:data atIndex:0];
[[NSUserDefaults standardUserDefaults] setObject:recentAppBookmarks
forKey:MDRecentDocumentsKey];
}
要獲得最近的文件在應用程序啓動列表中,你可以做這樣的事情:
- (void)awakeFromNib {
recentAppURLs = [[NSMutableArray alloc] init];
NSArray *recentAppBookmarks =
[[NSUserDefaults standardUserDefaults] objectForKey:MDRecentDocumentsKey];
for (NSData *bookmarkData in recentAppBookmarks) {
NSURL *resolvedURL = [NSURL URLByResolvingBookmarkData:bookmarkData
options:NSURLBookmarkResolutionWithoutUI|NSURLBookmarkResolutionWithoutMounting
relativeToURL:nil bookmarkDataIsStale:NULL error:NULL];
if (resolvedURL) [recentAppURLs addObject:resolvedURL];
}
}
否則,如果您需要與OS X 10.5及更早版本兼容,我在NSString
in this answer上發佈了一些類別。
網址書籤和別名不是一回事。類似的想法,但它們不可互換:不能將書籤數據傳遞給別名管理器,也不能將數據別名傳遞給NS/CFURL。 –
也許如果你編輯的問題,使其更一般。 –
@StevenFisher,唯一的區別是問題的標記方式。這裏的問題實際上只是「我如何存儲一些沒有Core Data的數據」,在這方面Cocoa和Cocoa Touch是一樣的。我會給另一個問題添加一個標籤,使其更加通用。 – Caleb
這與其他文章有很大不同**,它處理保存對文件的引用(並且以持久方式引用文件的最佳方式是使用Alias(「書籤」)數據,而不是**純文件路徑)。 – NSGod