NSUserDefaults setObject:forKey死锁?

时间:2015-07-09 14:18:02

标签: ios objective-c nsuserdefaults deadlock

今天我遇到了一个相当混乱的问题:

当我的应用程序启动时,我会下载一些内容并在解析响应后将数据写入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);
    }
}

1 个答案:

答案 0 :(得分:0)

更新了新的代码示例:

您应该将decodingData转换为存档数据,以便将其存储在NSUserDefaults中:

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

用这个检索数据:

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