문제

일부 소셜 네트워크의 고객 인 iPhone 앱을 작성하고 있습니다. 앱은 여러 계정을 지원합니다. 계정에 대한 정보는 키드 아카이브에 저장됩니다.

저장에 사용되는 방법 :

- (void) saveAccounts {
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *path = [paths objectAtIndex:0];
 path = [path stringByAppendingPathComponent:@"accounts.bin"];
 // NSMutableArray *accounts = ...;
 [NSKeyedArchiver archiveRootObject:accounts toFile:path];
}

읽기에 사용하는 방법 :

- (NSMutableArray *) loadAccounts {
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *path = [paths objectAtIndex:0];
 path = [path stringByAppendingPathComponent:@"accounts.bin"];
 NSMutableArray *restoredAccounts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
 return [restoredAccounts retain];
}

방법 saveAccounts 일부 계정이 추가/수정/삭제 된 경우에만 사용됩니다. 방법 loadAccounts 앱이 시작될 때마다 사용됩니다. 이 파일에 액세스하는 다른 코드는 없습니다.

나와 내 테스터 중 한 명이 문제를 겪습니다. 언젠가는 행동하기 시작합니다 accounts.bin 누락. 만약에 loadAccounts 보고 nil, 앱은 계정을 추가하도록 제안합니다. 계정을 입력 한 후 (앱은 전화해야합니다. saveAccounts), 앱은 정상적으로 작동하지만 다시 시작하면 계정을 다시 추가하도록 요청합니다. 유일한 솔루션은 앱을 iPhone에 너무 다시 설치하는 것입니다. 다시 설치 한 후에는 문제가 발생하면 일정 시간 동안 작동합니다.

우리 (문제를 겪는 나와 내 테스터)는 3.1.2로 iPhone 3G를 사용합니다. 3.1.2로 iPhone 3GS 에서이 문제를 경험하지 않은 다른 테스터.

이 파일이 사라지는 이유는 무엇입니까?

업데이트

내 코드에서 버그를 찾았습니다. 전체 문서 디렉토리를 삭제하는 코드가있었습니다. 코드 의이 부분은 원격 서버 관련 이므로이 코드를 추적하기가 어려웠습니다. 버그는 매우 드문 조건에서만 나타났습니다.

이제 버그가 발견되고 코드가 수정됩니다. WKW의 대답은 내 문제를 해결하지 못했지만 더 깊이 파고 들었습니다. 고맙습니다!

도움이 되었습니까?

해결책

디버깅 장치로서 문서 디렉토리의 내용을 LoadAccounts로 또는 최소한 Unarchiver가 NIL을 반환 할 때마다 어떻게. 아래에 파일 이름을 디렉토리에 가져 오기위한 코드가 있습니다. 중단 점을 설정하고 NSARRAY를 버려서 항목을보십시오.
파일이 문서 Dir에 존재한다는 것을 알 수 있다면 문제가 다른 곳에 있습니다. 아마도 그것은 성공적으로 보관되지 않았을 것입니다. 호출에서 반환 값을 확인하여 데이터를 보관하십시오.

if( ! [NSKeyedArchiver archiveRootObject:accounts toFile:path] ){
    NSLog(@"Oooops! account data failed to write to disk");
}

디렉토리에서 파일 이름 가져 오기 :

- (NSArray*) directoryContentsNames:(NSString*) directoryPath {
    NSArray* result;
    {
        result = [[NSFileManager defaultManager]
            directoryContentsAtPath: directoryPath];
    }
    if( result && [result count] > 0 ){
        NSMutableArray *items = [[[NSMutableArray alloc] init] autorelease];
        for( NSString *name in result ){
            if( ! [name isEqualToString:@".DS_Store"] )
                [items addObject: name];
        }
        result = items;

    }
    return result;
}

아마도 nsuserDefaults를 사용하기가 더 쉬울까요?

또한 Nsarray의 writetofile 대신 Keyed (UN) 아카이버를 사용할 이유가 있습니까?

if( ! [accounts writeToFile:path atomically:YES] )
    ; // do something since write failed

파일을 읽으려면 다음과 같습니다.

NSMutableArray *accounts = [[NSArray arrayWithContentsOfFile:path] mutableCopy];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top