0

我正在尝试从 Parse 下载图像,当我从 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");
                        }

                    }];
                }
            }
        }];
4

2 回答 2

5

tl;博士

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就是使用的原因,通常用于表示nullJSON 响应中返回的值。

将消息发送到nil静默失败,而将无法识别的选择器发送到NSNull单例将导致崩溃。

还要记住,如果在字典中找不到密钥,objectForKey:它将返回。nil

于 2013-08-21T15:14:37.277 回答
0

我知道这是旧的,但以防万一其他人遇到这个问题。对我来说,上面的答案没有用。对我有用的是在应用程序委托中启用本地数据存储。老实说,不知道为什么会这样,但我认为我应该分享

// Enable Local Datastore
[Parse enableLocalDatastore];
于 2015-06-27T22:14:25.603 回答