2014-04-24 8 views
0

Я делаю простую программу, которая может архивировать мой объект и разблокировать его при запуске.Как бороться с unarchiver с этой ситуацией ..?

У меня есть lists.m где изменяемый массив под названием favouritesList ПОЛУЧИТЬ магазин в файл, используя архив. Внутри списка, у меня есть простой объект, называемого favouriteItem

Таким образом, проблема происходит с этим кодом

-(void) loadList 
{ 

self.favouritesList = 
[[NSKeyedUnarchiver unarchiveObjectWithFile:self.fileName] mutableCopy]; 
if(self.favouritesList == nil) 
    self.favouritesList = [[NSMutableArray alloc]init]; 

} 

Исключения, у меня есть это [NSKeyedUnarchiver initForReadingWithData]: непонятный архив (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)»

я знаю, что я разархивировав с файлом, который пуст (на самом деле он копируется из файла из пучка, который также является пустым).

Итак, как я могу избежать этого, когда все еще хочу, чтобы мое приложение загружало данные из файла при запуске. Когда я использовал в качестве следующего кода

-(void) loadData { 
    self.URLLists = [NSMutableArray arrayWithContentsOfFile:self.path]; 
    if(self.URLLists == nil) { 
    self.URLLists = [[NSMutableArray alloc]init]; 
    } 

} 

Здесь, даже если файл на self.path был пуст, он вернется нолем, и я могу только сказать , если он возвращается ноль, я назначу новую для первый раз. Но, с NSkeyedUnarchiver это работает по-другому. Не могли бы вы объяснить, как это отличается и как я могу избежать этой ошибки ..? Спасибо.

ответ

2

Легче выход заключается в использовании обработки исключений: документация

@try { 
      self.favouritesList = 
[[NSKeyedUnarchiver unarchiveObjectWithFile:self.fileName] mutableCopy]; 
    } 
    @catch (NSException *e) { 
      self.favouritesList = [[NSMutableArray alloc]init]; // add more code as needed 
    } 

от Apple здесь.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html#//apple_ref/doc/uid/20000059-BBCHGJIJ

+0

как насчет корпуса arrayWithContentsOfFile ?? Мне не нужно справляться с каким-либо исключением, потому что это не бросает? –

+1

@denis_choe: Да. Если вы прочитали документы для [unarchiveObjectWithFile:] (https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSKeyedUnarchiver_Class/Reference/Reference.html#//apple_ref/occ/clm/NSKeyedUnarchiver/unarchiveObjectWithFile :) и [arrayWithContentsOfFile:] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/clm/ NSArray/arrayWithContentsOfFile :), каждый из них говорит, как они реагируют на пустой файл. NSKeyedUnarchiver генерирует исключение, а NSArray просто возвращает nil. – Chuck

0

Вместо того, чтобы разархивировать пустой файл, почему бы вам не просто файл содержит пустой массив? Тогда вам не нужны специальные случаи.

+0

не могли бы вы объяснить, как вы это сделаете, пожалуйста.? –

+0

вы имеете в виду сделать этот файл с пустым массивом в .. где ..? Я имею в виду внутри viewdidload? –

+1

@denis_choe: Я имею в виду файл, который вы пытаетесь разблокировать здесь, тот, который вы копируете из пустого пула. Вместо того, чтобы хранить пустой пул в вашем пакете и копировать его, почему бы не содержать в нем пустой массив? – Chuck