我有一个方法,可以异步地在UITableViewCell中设置UIImageView的图像。方法如下:
__weak ProductTableCell *weakCell = cell;
__weak ProductsViewController *weakSelf = self;
[CommonHandlers setImageForItemId:[product stringID] withImageURL:product.imageURL forImageView:cell.imageView withImagesCache:self.imageCache completionBlock:^UIImage *(UIImage *img) {
ProductTableCell *localCell = weakCell;
ProductsViewController *localSelf = weakSelf;
// New image view that will contain both layers
UIImageView *mergedImageView = [[UIImageView alloc] initWithImage:img];
// Place imageView layer over, this is the sticker layer drawn elsewhere
CALayer *discountLayer = localCell.imageView.layer;
// Merge layers
[mergedImageView.layer addSublayer:discountLayer];
// Get image from both layers
UIImage *flattenedImage = [ImageHandlers imageFromLayer:mergedImageView.layer];
return flattenedImage;
}];
在此方法采用的块中,我在下载时拍摄图像并将其与产品图像顶部的贴纸图层合并。
在setImageForItemId: withImageURL: forImageView: withImagesCache: completionBlock:^UIImage *(UIImage *)
内,我执行通常的dispatch_async
内容以异步方式下载图像,下载后,我在其中调用上面的块:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *imageThumb = [UIImage imageWithData:[NSData
dataWithContentsOfURL:IMAGEURL]];
if (imageThumb) {
if (imageBlock) {
UIImage *processedImage = imageBlock(imageThumb);
if (processedImage) {
[imagesCache setObject:processedImage forKey:stringID];
}
}
else{
[imagesCache setObject:imageThumb forKey:stringID];
}
}
else{
NSLog(@"Returned image is null!");
}
dispatch_async(dispatch_get_main_queue(), ^{
...
imageView.image = imagesCache[stringID];
});
});
虽然在调试中逐步执行代码会显示图像已下载并与贴纸正确合并,然后在imageCache字典中设置生成的imageView图像为零。
有关为何会发生这种情况的任何想法?我试图在堆上创建处理过的图像,但这也不起作用。
提前致谢。