UIImageView 图像未在 GCD 的主线程上更新
Posted
技术标签:
【中文标题】UIImageView 图像未在 GCD 的主线程上更新【英文标题】:UIImageView image not updating on main thread from GCD 【发布时间】:2013-02-01 03:33:02 【问题描述】:我有一段代码采用缩略图,对其应用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
时,它工作得非常好。任何人都知道为什么这可能不起作用?
【问题讨论】:
【参考方案1】:尝试重新加载该单元格:
[self.tableView reloadRowsAtIndexPath:indexPath withAnimation:UITableViewRowAnimationAutomatic]
【讨论】:
不需要重新加载单元。刷新 uiimageview 应该可以。 我不确定它是如何工作的。在应用程序的其他任何地方更新 UIImageView 的图像会立即显示结果,但在表格单元格中需要重新显示(无需重新加载整个单元格)?这是为什么呢? 我没有提到我正在使用布局子视图来布局我的 UITableViewCell 的子视图,可能就是这样。【参考方案2】:发生这种情况是因为我在其 layoutSubviews 方法中加载了 UITableViewCell(我正在设置 UIImageView 的框架),这与我的 GCD 线程发生了冲突。我将所有这些代码移至 layoutSubviews,现在它可以正常工作了。
【讨论】:
【参考方案3】:有几件事要检查 -
首先,您是否可能没有为该 nib 文件设置自定义视图?我有同样的问题。我为该视图控制器创建了一个 UIview 子类,进入 Interface Builder 并将视图设置为该 UIView 子类,然后将 UIView 的导入标头添加到 Controller 类中。这就是为我做的事
【讨论】:
以上是关于UIImageView 图像未在 GCD 的主线程上更新的主要内容,如果未能解决你的问题,请参考以下文章
Gif 图像(来自 url)未在 uiimage 视图中加载