我有一个自定义的UITableViewcell,它应该在使用该代码时加载一个Image:
- (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]];
imageView.image = image;
NSLog(@"test");
});
}
它非常快速地加载Image,所以我得到响应“test”非常快,但它需要加载到tableView中。此外,如果我选择该行,则会加载图像。
如何解决此问题?
由于
答案 0 :(得分:2)
只要将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)初始化中初始化;你细胞的方法 2)通过视图控制器上的类方法使其成为静态对象 2)创建一个可用于表格单元格的单例实例
设计偏好取决于您,并取决于您希望保持一致的其他实践。
答案 1 :(得分:0)
完成下载图像后,您应该调用[tableView reloadData]。
有一个类似的问题与已接受的答案,但它也建议使用SDWebImage。看看:How to get UITableViewCell images to update to downloaded images without having to scroll UITableView