我已经被这个问题困扰了几个小时,老实说,我找不到解决方法,我试图使用UserDefaults存储NSDictionary,但由于某种原因,它在运行时在main方法崩溃,即使我存储的NSDictionary是UserDefaults的合法类型。
这是我的代码:
-(void)getEventAlbums
{
NSURL *baseURL = [NSURL URLWithString:[ELConfig getBaseUrl]];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSString *urlString = [NSString stringWithFormat:@"album/getAlbums/%@", [self.mEventData valueForKey:@"eventKey"]];
[manager POST:urlString parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
_albumsDict = [(NSDictionary *)responseObject objectForKey:@"data"];
[[NSUserDefaults standardUserDefaults] setObject:_albumsDict forKey:@"feedAlbums"];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
// failure
NSLog(@"Error retreiving albums");
}];
}
BTWALBUMSDIC是NSARRAY类型。
检查那个ResponseObject中的所有嵌套数据(在所有数组和字典中)。某处有一些不属于NSArray、NSDictionary、NSString、NSNumber、NSData或NSDate类的东西。通过这种方式,正如您所使用的那样,您只能存储100%的plist兼容数据。
如果您的类支持NSCoding协议,您可以将您的对象转换为NSData,并将其保存在NSUserDefaults中。
此代码可以帮助您检查是否有有效的属性列表:
- (BOOL)isValidPropertyList:(id)object {
NSData *xmlData;
NSError *error;
xmlData=[NSPropertyListSerialization
dataWithPropertyList:object
format:NSPropertyListXMLFormat_v1_0
options:0
error:&error
];
if(xmlData)
{
return YES;
}
else
{
NSLog(@"Tested object is not a valid property list: %@",error);
}
return NO;
}
添加到您的类中,并使用[self isValidPropertyList:_AlbumsDict];