无法在Parse块中向NSMutableDictionary添加对象

时间:2015-03-04 13:28:23

标签: ios objective-c xcode parse-platform nsmutabledictionary

我正在从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


}

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

1 个答案:

答案 0 :(得分:1)

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

handler(YES,nil);

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

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

注意

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