UIImageView图像未在GCD主线程上更新

时间:2013-02-01 03:33:03

标签: iphone ios cocoa-touch uiimageview

我有一些带缩略图的代码,对其应用CoreImage过滤器,然后将其设置为自定义UITableViewCell's imageView属性:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
    ^{
        CIImage *inputImage = [[CIImage imageWithCGImage:self.thumbnail.CGImage]retain];
        CIFilter *filter =    [[CIFilter filterWithName:@"CISepiaTone" keysAndValues:
                                kCIInputImageKey, inputImage,
                                @"inputIntensity", [NSNumber numberWithFloat:1.0],
                                nil] retain];
        CIImage *outputImage = [[filter outputImage] retain];
        CGImageRef cgimage = [self.context createCGImage:outputImage fromRect:[outputImage extent]];
        filtersTableViewCellItem.thumbnail = [UIImage imageWithCGImage:cgimage];

        [filter release];
        [outputImage release];
        [inputImage release];
        CGImageRelease(cgimage);

        dispatch_async(dispatch_get_main_queue(),
        ^{
            UITableViewCell *tableViewCell = [[self cellForRowAtIndexPath:indexPath] retain];

            if (tableViewCell)
            {
                [filtersTableViewCell.activityIndicatorView stopAnimating];
                filtersTableViewCell.imageView.image = filtersTableViewCellItem.thumbnail;
            }

            [tableViewCell release];
        });
    });

缩略图正在正常生成,但它没有在imageView上自行更新。我试过setNeedsDisplay无济于事。有趣的是,当我使用类似这样的代码,但没有使用自定义UITableViewCell时,它的工作非常好。任何人都知道为什么这可能不起作用?

3 个答案:

答案 0 :(得分:1)

尝试重新加载该单元格:

[self.tableView reloadRowsAtIndexPath:indexPath withAnimation:UITableViewRowAnimationAutomatic]

答案 1 :(得分:1)

这种情况正在发生,因为我在其layoutSubviews方法中加载了UITableViewCell(我正在设置UIImageView的框架),这与我的GCD线程发生了一些冲突。我将所有这些代码移动到layoutSubviews,现在它工作正常。

答案 2 :(得分:0)

你可以检查几件事 -

首先,您是否可能没有为该nib文件设置自定义视图?我有同样的问题。我为该视图控制器创建了一个UIview子类,进入Interface Builder并将视图设置为该UIView子类,然后将UIView的导入头添加到Controller类中。这就是为我做了什么