Вопрос

Я пишу приложение для 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, после переустановки оно работает в течение некоторого времени с любыми проблемами.

Мы (я и мой тестер, которые получают проблему) используем iPhone 3G с 3.1.2. Еще один тестер, который не испытал эту проблему на своем iPhone 3GS с 3.1.2.

Есть идеи, почему этот файл исчезает?

Обновить

Я нашел ошибку в своем коде. Был код, который удаляет весь каталог документов. Поскольку эта часть кода связана с удаленным сервером, было трудно отследить этот код. Ошибка появилась только в очень редких условиях.

Теперь ошибка найдена, и код исправлен. Ответ WKW не решил мою проблему, но он заставил меня копать глубже. Благодарю вас!

Это было полезно?

Решение

Как насчет -в качестве устройства отладки -просвечивающего содержимое каталога ваших документов в LoadAccounts или, по крайней мере, всякий раз, когда Unarchiver возвращает ноль. Есть какой -то код ниже, чтобы получить имена файлов в каталоге. Установите точку останова и просто сбросите NSArray, чтобы просмотреть элементы.
Если вы видите, что файл существует в DOCS 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 может быть проще в использовании?

Кроме того, есть ли причина использовать ключевой (ООН) архивера вместо писательницы Нсаррея?

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

и прочитать файл в:

NSMutableArray *accounts = [[NSArray arrayWithContentsOfFile:path] mutableCopy];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top