我正在尝试从Parse下载图像,当我完成从解析程序下载所有图像时,程序崩溃并出现错误:
NSNull getDataInBackgroundWithBlock:progressBlock:]:发送到实例的无法识别的选择器。
我尝试添加一些条件,例如
if(![object objectForKey:@"goal_image"]) //If it is nil => exit
但它仍在崩溃。这是我的代码:
PFQuery *query = [PFQuery queryWithClassName:@"Goal"];
[query getObjectInBackgroundWithId:[object objectId] block:^(PFObject *object, NSError *error) {
if(!error)
{
PFFile * imageFile = [object objectForKey:@"goal_image"];
if (imageFile) {
[imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error2) {
if (!error2) {
NSString *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Images/Goals/%@",[object objectId]]];
[data writeToFile:jpgPath atomically:YES];
}
} progressBlock:^(int percentDone) {
if (percentDone == 100) {
NSLog(@"Download Completed");
}
}];
}
}
}];
答案 0 :(得分:5)
除了检查NSNull
之外,您应该检查nil
。
PFFile * imageFile = object[@"goal_image"]; // note the modern Obj-C syntax
if (imageFile && ![image isEqual:[NSNull null]]) {
...
}
NSNull
与nil
不同,第一个是对象。
由于NSArray
和NSDictionary
仅保留对象,nil
无法存储在此类容器中,这就是使用NSNull
的原因,通常代表null
JSON响应中返回的值。
向nil
发送消息无声地失败,而向NSNull
单例发送无法识别的选择器将导致崩溃。
另请注意,如果字典中未找到密钥,objectForKey:
将返回nil
。
答案 1 :(得分:0)
我知道这是旧的,但以防万一其他人遇到这个问题。对我来说,上述答案并不奏效。对我有用的是在app delegate中启用本地数据存储。老实说,不知道为什么会这样,但我想我应该分享
// Enable Local Datastore
[Parse enableLocalDatastore];