2011-09-19 2 views
2

가능한 중복 : 여기
iOS store just a little bit of dataOS X/Cocoa에 데이터를 저장하는 기본 방법은 무엇입니까?

새로운 OS X dev에. 저장해야 할 사용자 데이터가 아주 적습니다 (최근 열린 파일의 경로, 실제로). 이들을 코코아 땅에 저장하는 가장 좋은 방법은 무엇입니까? Core Data에 대해 들어 보았습니다. 그러나이 같은 MS에서 수 많은 API를 경험 한 Windows 개발자로서 실제로이 프로그램을 사용합니까?

물론 내 모든 파일을 내 파일에 쓸 수는 있지만 올바른 방법 (TM)을 사용하는 것이 좋습니다.

어떤 제안이 좋을까요?

+0

그 질문을 좀 더 일반적인 것으로 편집 한 경우 일 수 있습니다. –

+0

@StevenFisher, 유일한 차이점은 질문에 태그가 지정되는 방식입니다. 여기에있는 질문은 실제로 "어떻게 코어 데이터가없는 일부 데이터를 저장합니까?"라는 점입니다.이 점에서 코코아와 코코아 터치는 동일합니다. 다른 질문에 태그를 추가하여 좀 더 일반적인 것으로 만듭니다. – Caleb

+0

이것은 파일에 대한 참조를 저장한다는 점에서 다른 게시물과 크게 다를 수 있습니다 ** (지속적으로 파일을 참조하는 가장 좋은 방법은 별칭 ("북마크") 데이터를 사용하는 것입니다 ** ** ** 일반 파일 경로). – NSGod

답변

7

응용 프로그램이 문서 기반 인 경우 최근에 열었던 파일 목록이 자동으로 저장됩니다. 직접 저장해야하는 경우 NSUserDefaults을 사용하는 것이 좋습니다. 환경 설정 및 최근 사용한 항목과 같은 간단한 정보를 저장하는 가장 일반적인 방법입니다.

예, 사람들은 핵심 데이터를 사용하지만 일반적으로 다른 부분이있는 문서처럼 더 복잡한 데이터에 사용됩니다.

3

데이터 저장을위한 다섯 가지 제안에 대해서는 my answer에서 this thread을 참조하십시오. 이 스레드는 iOS를 다루지 만 코코아 대신 코코아 터치를 다루지 만 그 대답은 모두 거의 같습니다.

첫 번째 답변 인 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]; 

이 코어 데이터에 관해서는, 그래, 많은 사람들이 그것을 사용할 수 있습니다. 영속 객체를 관리하는 아주 좋은 방법입니다. 그러나, 그것은 당신이 단지 많은 경로를 저장하는 데 필요한 것보다 더 많은 것처럼 들립니다.

0

앞서 언급했듯이 NSDocument 아키텍처는 이미 최근 문서 목록을 유지 관리합니다. 기본 폴더를 살펴보면 *.LSSharedFileList.plist 환경 설정 파일에이 데이터가 저장됩니다.

속성 목록 편집기 또는 Xcode 4에서 이러한 파일을 살펴보면 별칭 (또는 "북마크") 데이터를 사용하는 것이 영구적 인 방법으로 파일에 대한 참조를 저장하는 기본 방법을 알 수 있습니다. Windows/* nix 배경에서 오는 경우 별칭 데이터는 이름이 바뀌거나 이동 된 경우에도 항목을 추적 할 수 있습니다.

최근 파일 목록을 직접 저장해야하고 OS X 10.6 이상이 필요한 경우 NSURL에있는 북마크 데이터 기능과 함께 NSUserDefaults을 사용할 수 있습니다.파일을 엽니 다 당신의 방법에서

, 당신은 이런 식으로 뭔가를 할 수 :

- (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]; 
    } 

} 

:

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]; 


} 

를 앱 시작시 최근 파일 목록을 얻으려면, 당신이 뭔가를 할 수 있습니다 그렇지 않으면 OS X 10.5 이전 버전과의 호환성이 필요하다면 NSStringin this answer에 몇 가지 카테고리를 게시했습니다.

+1

URL 북마크와 별칭이 동일한 것은 아닙니다. 비슷한 생각이지만 상호 교환 할 수 없습니다. 북마크 데이터를 Alias ​​Manager에 전달하거나 NS/CFURL에 별칭 데이터를 전달할 수 없습니다. –

관련 문제