只要 setImageWithURL: 被称为 cellForRowAtIndexPath 的效果,那么它应该会如您所愿地显示出来......但是,您需要调用 imageView.image = image; 在主线程上。这适用于所有与 UI 相关的任务。所以你会想要:
- (void)setImageWithURL:(NSURL *)URL
{
dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(taskQ, ^{
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
dispatch_async(dispatch_get_main_queue(), ^{
imageView.image = image;
NSLog(@"test");
});
});
}
编辑:
使用 NSOperationQueue。
创建一个操作队列作为视图控制器的成员。
m_operationQueue = [NSOperationQueue new];
m_operationQueue.maxConcurrentOperationCount = 1 // if you want to load images in order;
确保在视图卸载和表刷新时取消操作
[m_operationQueue cancelAllOperations];
在 setImageWithURL 中做你的事
- (void)setImageWithURL:(NSURL *)URL
{
[m_operationQueue addOperationWithBlock:^{
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
dispatch_async(dispatch_get_main_queue(), ^{
imageView.image = image;
NSLog(@"test");
});
}];
}
再次编辑:
抱歉,忘记了 setImage 在您的自定义表格单元格中。您可以:
1) 使其成为您在 +(void)initialize 中初始化的静态对象;单元格的方法 2)通过视图控制器上的类方法使其成为一个静态对象 2)创建一个可用于表格单元格的单例实例
设计偏好取决于您,如果您想要保持一致,则取决于您一直在使用的其他实践。