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