NSKeyedUnarchiver - как предотвратить сбой - PullRequest
7 голосов
/ 26 сентября 2011

Я думаю, это очень очевидно, но у меня есть вопрос о загрузке данных.Если есть файл с именем library.dat, в котором хранится всякая информация об объектах в приложении.Все настроено хорошо (с точки зрения методов initWithCoder, encodeWithCoder и т. Д.), Но мне было просто интересно, что произойдет, если библиотека.dat когда-либо будет повреждена.Я сам немного его испортил, и приложение зависнет.Есть ли способ предотвратить сбой?Могу ли я проверить файл перед загрузкой?Вот бит, который потенциально может быть очень фатальным:

    -(void)loadLibraryDat {

    NSLog(@"loadLibraryDat...");
    NSString *filePath = [[self documentsDirectory] stringByAppendingPathComponent:@"library.dat"];

    // if the app crashes here, there is no way for the user to get the app running- except by deleting and re-installing it...
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];



}

Я посмотрел на * NSInvalidUnarchiveOperationException, но не представляю, как я должен реализовать это в своем коде.Буду благодарен за любые примеры.Заранее спасибо!

Ответы [ 2 ]

14 голосов
/ 26 сентября 2011

Вы можете заключить разархивированный вызов с помощью @try {} @ catch {} @ наконец. Это описано в документации Apple здесь: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/ObjectiveC/Chapters/ocExceptionHandling.html

@try {
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
} @catch ( NSInvalidUnarchiveOperationException *ex ) {
    //do whatever you need to in case of a crash
} @finally {
    //this will always get called even if there is an exception
}
4 голосов
/ 26 сентября 2011

Вы пробовали блоки 'try / catch'?Как то так:

@try {
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
}
@catch (NSException* exception) {
    NSLog(@"provide some logs here");
    // delete corrupted archive
    // initialize libraryDat from scratch
}
...