Ios NSUserDefaults setObject:forKey死锁?

Ios NSUserDefaults setObject:forKey死锁?,ios,objective-c,nsuserdefaults,deadlock,Ios,Objective C,Nsuserdefaults,Deadlock,今天我遇到了一个相当令人困惑的问题: 当我的应用程序启动时,我正在下载一些东西,解析响应后,我将数据写入NSUserDefaults。 现在这一切都很好,直到我最近发现,有时我的整个UI会冻结,直到我重新启动应用程序后才会解冻。当我在调试器中点击暂停程序执行时,我得到: 文档中说NSUserDefaults是线程安全的,从我所看到的情况来看,没有其他线程试图访问用户默认值 如果您有任何关于如何解决/进一步调试此问题的想法,我们将不胜感激 提前谢谢 导致问题的代码: 这是在我收到Web服务的响应

今天我遇到了一个相当令人困惑的问题:

当我的应用程序启动时,我正在下载一些东西,解析响应后,我将数据写入NSUserDefaults。 现在这一切都很好,直到我最近发现,有时我的整个UI会冻结,直到我重新启动应用程序后才会解冻。当我在调试器中点击暂停程序执行时,我得到:

文档中说NSUserDefaults是线程安全的,从我所看到的情况来看,没有其他线程试图访问用户默认值

如果您有任何关于如何解决/进一步调试此问题的想法,我们将不胜感激

提前谢谢

导致问题的代码:

这是在我收到Web服务的响应后调用的:

+ (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);
    }
}

更新了新的代码示例:

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

if (!error && decodedData) {
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: decodedData]];
    [userDefaults setObject: archivedData forKey:kUserDataUserDefaultsKey];
}
并使用以下命令检索数据:

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

你能提供一些代码吗
NSUserDefaults
是线程安全的,因为当调用
setValue:forKey:
时,它会锁定对包含值的字典的访问。您找到此问题的原因了吗?在同时使用NSUserDefaults时,我遇到了类似的死锁。I“我遇到了类似的问题,我的是特定于设备的。模拟器和大多数其他手机都没有问题,但iPhone 5s。我认为这是一个时间问题。如果我能在某个地方延迟一下来清理它?在iOS 11.2.5上仍然时常发生这很有趣。。你认为这就是锁的原因吗?@Subbu我认为这更像是一种“用火杀死它”的解决方案,假设问题是由传递的数据不符合NSCoding协议引起的。@thattyson谢谢你的回答!然而,我几乎不认为这会导致锁。在propertyListWithData之后:。。。返回decodedData数组仅包含符合NSCoding的NSString对象…它在大多数情况下都有效。只是有时候这条线索似乎僵住了…@DavidSilverfarmer啊,我想我看错了你的问题;我不知道这只是冻结了一些时间。