我正在从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
}
不确定这里发生了什么,这让我有点生气。什么想法可能是错的?
答案 0 :(得分:1)
我怀疑你的问题是因为这一行:
handler(YES,nil);
这是在外部块的末尾运行,但是图像是由for循环中的内部块下载的。 for循环将触发所有这些内部块,然后完成并运行完成处理程序,然后一段时间后您的图像将到达。
您需要等到所有这些内部块都已完成。
注意强>
如果要下载的图像超过1个,只需将完成调用移动到内部块就不起作用,因此您需要跟踪列表并在下载最后一个图像时触发内部块。记住它们可以在不同的时间到达,因此它不是简单地触发最后一个内部块,而是当它们全部返回成功或错误时触发。因此,在每个内部块中增加一个计数器,然后在内部块中检查计数是否已达到您期望的图像数量