2012-06-11 3 views
0

그래서 내가 만들고있는 앱의 오프닝 사이에 데이터를 저장하려고합니다.하지만 내가 만들고있는 디렉토리와 저장하고있는 데이터가 지속되지 않습니다.디렉토리가 iOS 앱 실행 사이에 지속되지 않음

내가 pathForDataFile 디렉토리를 생성하는 결과를 인쇄
- (NSString *)pathForDataFile 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,  YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    documentsDirectory = [documentsDirectory stringByAppendingPathComponent:@"MyApp"]; 
    NSLog(@"%@", documentsDirectory); 

    NSError *error; 
    NSLog(@"%i", (int)[[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:&error]); 

    return documentsDirectory; 
} 

- (void)saveDataToDisk 
{ 
    NSString * path = [self pathForDataFile]; 

    NSMutableDictionary * rootObject; 
    rootObject = [NSMutableDictionary dictionary]; 

    [rootObject setValue: [self usedPlaces] forKey:@"key"]; 
    [NSKeyedArchiver archiveRootObject: rootObject toFile: path]; 
} 

- (void) loadDataFromDisk 
{ 
    NSString  * path = [self pathForDataFile]; 
    NSDictionary * rootObject; 

    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path];  
    [self setObject: [rootObject valueForKey:@"key"]]; 
} 

은, 때마다 그것이 어떤 의미 1 인쇄 : 나는 세 가지 방법을 왜 ...

응용 프로그램 구멍 사이에, 나는 알아낼 수 없습니다 한 번 호출 한 후에 디렉토리가 이미 존재해야하므로 할 수 없더라도 디렉토리를 만들 때마다. saveDataToDiskapplicationWillTerminate에서 호출되고 loadDataFromDiskapplicationDidBecomeActive에서 호출됩니다. 왜이 일이 일어나는 지 아무도 나를 도울 수 있습니까?

+1

applicationWillTerminate 당신에게 충분한 시간을 제공하지 않을 수 있습니다. 테스트 목적으로 다른 곳에서 그 메소드를 호출 할 수 있습니까? –

+0

@WarifAkhandRishi 문제는 'NSLog()'를 출력한다는 것입니다. 그래서 메서드가 제 시간에 호출되는 것을 의미합니다. 타이밍 문제는 아닙니다 ... –

답변

0

문제가 실제로 발생한 위치를 좁히려면 코드에서 몇 가지 추가 오류 검사를 수행해야합니다. 원래 샘플 코드의 새로운 라인처럼 확인

오류 :

- (NSString *)pathForDataFile 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    documentsDirectory = [documentsDirectory stringByAppendingPathComponent:@"MyApp"]; 
    BOOL success = [[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:&error]; 
    // success is NO only if there is an error. success is YES if directory was created or if the directory already exists 
    if(success == NO) 
    { 
     NSLog(@"error creating directory at path %@ is %@", documentsDirectory, [error localizedDescription]); 
    } 

    return documentsDirectory; 
} 

- (void)saveDataToDisk 
{ 
    NSString * path = [self pathForDataFile]; 
    if(([self usedPlaces] == NULL) || ([self usedPlaces count] == 0)) 
    { 
     NSLog(@"usedPlaces is either null or has no entries"); 
    } 
    NSDictionary * rootObject = [NSDictionary dictionaryWithObject: [self usedPlaces] forKey: @"key"]; 
    BOOL success = [NSKeyedArchiver archiveRootObject: rootObject toFile: path]; 
    if(success == NO) 
    { 
     NSLog(@"was not able to write data to path %@", path); 
    } 
} 

- (void) loadDataFromDisk 
{ 
    NSString  * path = [self pathForDataFile]; 
    NSDictionary * rootObject; 

    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
    if(rootObject) 
     [self setObject: [rootObject valueForKey:@"key"]]; 
    else 
     NSLog(@"was not able to load data from file at %@", path); 
} 
+0

이 오류 검사를 사용했고,이 라인 출력 된 것이 무엇입니까 (각 메서드는 하나의 오류를 출력하고 오류는 메서드가 위에있는 순서대로 있음) '는/var/mobile/Applications/B2D28246-F274-4789-9976에있는 파일에서 데이터를로드 할 수 없었습니다 -178EF6F649CC/Library/MyApp' '는/var/mobile/Applications/B2D28246-F274-4789-9976-178EF6F649CC/Library/MyApp''경로에 데이터를 쓸 수 없거나/var/mobile/Applications/B2D28246-F274-4789-9976-178EF6F649CC/Library/MyApp' 편집 : 잘못된 포맷팅에 대해서는 유감스럽게 생각합니다. idk는 이것을 고치는 법을 ... –

+0

"NSKeyedArchiver" "saveDataToDisk'"에 실패했습니다. 제 생각에''usedPlaces' "속성에있는 객체 중 하나는 쉽게 보관할 수있는 객체가 아닙니다. 해당 배열/사전의 모든 항목 *을 디스크에 저장 (즉, NSCoding 프로토콜 준수) 할 수 있어야합니다. [개체 인코딩 및 디코딩에 대한 Apple의이 기사를 확인하십시오.] (http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Archiving/Articles/codingobjects.html#//apple_ref/doc/uid/ 20000948-BCIHBJDE). –

관련 문제