2013-05-20 2 views
0

Я создал одноэлемент FacebookManager, который вызывается в фоновом потоке при запуске моего приложения. Все работает отлично с менеджером facebook, синглом, приложением и т. Д. Однако, когда приложение запускается впервые, это довольно много секунд, прежде чем оно будет полезно, потому что менеджер facebook еще не закончил делать свое дело. Поэтому я хочу использовать NSKeyedArchiver для сохранения facebookManager и всех его словарей, чтобы при запуске приложение имело навигационный интерфейс, в то время как данные facebook обновляются в фоновом режиме. Имеют смысл?Неисправность Использование NSKeyedUnarchiver во время init

Все в FacebookManager.m, первый, когда менеджер выполняется обновление словарей друзей и т.д., я вызываю метод, который сохраняет данные:

- (BOOL)saveFacebookData 
{ 
    // returns success or failure 
    NSString *path = [self archivePath]; // just a helper method 

    return [NSKeyedArchiver archiveRootObject:self toFile:path]; 
} 

Тогда в INIT, я пытаюсь это, который, похоже, не работает. :

-(id)init 
{ 
    self = [super init]; 

    NSString *path = [self archivePath]; 
    self = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

    // If the manager hadn't been saved previously, create a new new one 

    if (!self) { 


     if (_idsByNameDict == nil) { 
      _idsByNameDict = [[NSMutableDictionary alloc] init]; 
     } 

     if (_photosByNameDict == nil) { 
      _photosByNameDict = [[NSMutableDictionary alloc] init]; 
     } 

     if (_installedByNameDict == nil) { 
      _installedByNameDict = [[NSMutableDictionary alloc] init]; 
     } 

     if (_allFriendsArray == nil) { 
      _allFriendsArray = [[NSArray alloc] init]; 
     } 

     basicPermissions = NO; 
     extendedPermissions = NO; 

     // Create synchronous dispatch queue for all facebook activity 
     if (_facebookUpdateQueue == nil) { 
      _facebookUpdateQueue = dispatch_queue_create("com.facebookUpdateQueue", NULL); 
     } 

    } 

Я думаю, что моя общая стратегия звук, но я спотыкаясь, как на самом деле захватить архивную версию менеджера во время инициализации! Любой совет?

ответ

1

Ваш класс должен реализовать <NSCoding> и оба его метода encodeWithCoder:, чтобы архивировать все ваши значения свойств и initWithCoder:, чтобы их архивировать. Обязательно вызывайте super в реализациях. Как правило, класс, использующий архивированный класс, знал бы о архивировании, но вы могли бы скрыть это знание в init, используя initForReadingWithData:, чтобы создать свой NSKeyedUnarchiver, а затем позвонить [self initWithCoder:...];.

+0

Спасибо за комментарий. Я думаю, что моя проблема больше связана с тем, как я написал несколько верхних строк инициализации и меньше связан с реализацией NSCoding. Я думаю, это потому, что я уже реализовал NSCoding и оба этих метода, и я вижу, изучая структуру dir, которую я успешно архивирую на диск. Проблема ограничивается тем, как распаковывать во время init. Хорошая новость заключается в следующем: я нашел еще одну подобную должность SO, и этот пост содержит довольно хороший образец, который я попытаюсь использовать сегодня вечером, когда вернусь домой: – zeeple

+0

http://stackoverflow.com/questions/2981269/initwithcoder-works- но-init-кажется-be-overw-my-objects-properties/2981453 # 2981453 – zeeple

+0

Wow-wow-wow! Очень опасное предложение! Я читаю его и реализую, когда вы описываете. Но в этом случае метод дочерних классов 'initWithCoder' не называется! Проведите весь день, чтобы найти, что неправильно! Используйте '[NSKeyedUnarchiver unarchiveObjectWithData: data];' – skywinder

Смежные вопросы