无法将对象添加到 Parse 块中的 NSMutableDictionary

Can't add object to NSMutableDictionary within Parse block

我正在从 Parse.com 下载贴纸对象,然后为其下载图像。由于某种原因,它不会添加到我的字典中。该对象创建得很好,但它不会添加。代码如下:

- (void)getNewStickersWithCompletionHandler:(stickerCompletionHandler)handler
{


    __weak StickerManager *weakSelf = self;
    PFQuery *stickersQuery = [PFQuery queryWithClassName:@"sticker"];
    NSNumber *total =[NSNumber numberWithInt:(int)[self.stickerDictionary count]];
    //im not sure this is a great way to add what if we miss one..there will be an error
    [stickersQuery whereKey:@"stickerNO" greaterThan:total];
    [stickersQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

        if(!error) {



            for( PFObject *object in objects) {

                NSString *title = object[@"title"];
                int stickerNO = [[object objectForKey:@"stickerNO"] intValue];


                //DOWNLOAD IMAGE CODE
                PFFile *image = object[@"image"];
                [image getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {

                    if(!error){

                        UIImage *image = [UIImage imageWithData:data];
                        Sticker *sticker = [[Sticker alloc] initWithTitle:title stickerNO:stickerNO image:image];
                        NSLog(@"%@",sticker.title);
                        //sticker has been created! but won’t add!
                        [weakSelf.stickerDictionary setObject:sticker forKey:sticker.title];
                    }

                }];//end get image block




            }//end for



            handler(YES,nil);


        }
    }];//end download stickers block


}

不确定这里发生了什么,这让我有点生气。有什么想法可能是错误的吗?

我怀疑你的问题是因为这一行:

handler(YES,nil);

这是 运行ning 在外部块的末尾,但是图像正在由内部块在 for 循环中下载。 for 循环将触发所有这些内部块,然后完成并 运行 你的完成处理程序,然后一段时间后你的图像将到达。

您需要等到所有这些内部块都完成。

备注

如果要下载的图像多于 1 个,将完成调用简单地移动到内部块将不起作用,因此您需要跟踪列表并在下载最后一个图像时触发内部块。请记住,它们可能会在不同的时间到达,因此它不仅仅是在最后一个内部块上触发,而是在它们都返回成功或错误时触发。所以在每个内部块中增加一个计数器,然后在内部块中检查计数是否达到您期望的图像数量