2015-07-09 2 views
4

Сегодня я столкнулся с довольно запутанной проблемой:NSUserDefaults setObject: forKey deadlocks?

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

Stacktrace

В документации сказано, что NSUserDefaults является поточно и от того, что я могу видеть никаких других потоков не пытаются получить доступ по умолчанию пользовательские ...

Любые идеи о том, как разрешить/продолжить отладку, были бы весьма полезны!

Заранее благодарен!

код, который вызывает проблему:

Это называется после того, как я получу ответ на WebService:

+ (void)updateWithData:(NSData *)data 
{ 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

    NSError *error; 
    NSArray *decodedData; 

    if (data) { 
     decodedData = [NSPropertyListSerialization propertyListWithData:data 
                  options:NSPropertyListImmutable 
                  format:NULL 
                   error:&error]; 
    } 

    if (!error && decodedData) { 
     [userDefaults setObject:decodedData forKey:kUserDataUserDefaultsKey]; 
    } 
    else{ 
     NSLog(@"%@", error.localizedDescription); 
    } 
} 
+0

Можете ли вы предоставить код? 'NSUserDefaults' является потокобезопасным, потому что, когда вызывается' setValue: forKey: ', он блокирует доступ к словарю, содержащему значения. – tailec

+0

Вы нашли причину этой проблемы? При одновременном использовании NSUserDefaults я сталкиваюсь с подобными взаимоблокировками. –

+0

Я сталкиваюсь с аналогичной проблемой, моя специфична для устройства. Нет проблем с симулятором и большинством других телефонов, но с iPhone 5. Я думаю, что это проблема с синхронизацией. Если я могу отложить задержку где-нибудь, чтобы ее очистить – ahalls

ответ

0

Обновлено с новым кодом образца:

Вы должны преобразовать decodedData в архивные данные для хранения в NSUserDefaults:

if (!error && decodedData) { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: decodedData]]; 
    [userDefaults setObject: archivedData forKey:kUserDataUserDefaultsKey]; 
} 

и извлечь данные с этим:

NSArray *storedData = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:kUserDataUserDefaultsKey]]; 
+2

Thats interesting .. Вы думаете, что это причина блокировки? – Subbu

+0

@Subbu Я бы сказал, что это больше похоже на «убить его с помощью огня», предполагая, что проблема вызванные переданными данными, не соответствующими протоколу NSCoding. – thattyson

+0

@thattyson Спасибо за ваш ответ! Однако я вряд ли думаю, что это вызовет блокировку. После того, как свойствоListWithData: ... возвращает его decodedData массив содержит только объекты NSString, которые соответствуют NSCoding ... –

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