无法将对象添加到 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 个,将完成调用简单地移动到内部块将不起作用,因此您需要跟踪列表并在下载最后一个图像时触发内部块。请记住,它们可能会在不同的时间到达,因此它不仅仅是在最后一个内部块上触发,而是在它们都返回成功或错误时触发。所以在每个内部块中增加一个计数器,然后在内部块中检查计数是否达到您期望的图像数量
我正在从 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 个,将完成调用简单地移动到内部块将不起作用,因此您需要跟踪列表并在下载最后一个图像时触发内部块。请记住,它们可能会在不同的时间到达,因此它不仅仅是在最后一个内部块上触发,而是在它们都返回成功或错误时触发。所以在每个内部块中增加一个计数器,然后在内部块中检查计数是否达到您期望的图像数量