处理UIImage并在块内返回它

时间:2014-10-13 08:54:29

标签: uitableview uiimageview uiimage objective-c-blocks

我有一个方法,可以异步地在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图像为零。

有关为何会发生这种情况的任何想法?我试图在堆上创建处理过的图像,但这也不起作用。

提前致谢。

0 个答案:

没有答案