在UITableView中从networking加载图像的更有效的方法是什么?
对于我的UITableView
每个UITableViewCell
,我在后台线程中从网上下载一个图像。 然后我使用主线程更新单元格中的imageView。
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ //Background Thread // download the image in separate thread UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString: @"someurl.com" ] ] ]; dispatch_async(dispatch_get_main_queue(), ^(void){ // this is called in the main thread after the download has finished, here u update the cell's imageView with the new image cell.eventImageView.image = image; }); });
滚动时,我没有注意到任何滞后。
但是,我想知道是否有更好的方法,如果有,我该怎么办?
谢谢
我更喜欢使用SDWebImage( 可以在这里findGit )
我写了一些类似于你的页面,它涉及非常简单的代码:
// Set and load the images [cell.menuImageView sd_setImageWithURL:url placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { // Get rid of the activity indicator when the image has been loaded [activity stopAnimating]; }];
在我看来,有一些好处:
1)图书馆是灵活的,并给你很多select你想要下载图像(这些只是less数)
例如:
- (void)sd_setImageWithURL:(NSURL *)url - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options - (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock
2)图书馆caching的图像意味着下一次你不必再下载它们。
3)图书馆得到很好的支持,帮助解决问题
我个人开始使用你使用的技术,发现有限制和困难(添加活动指标,如果图像缓慢下载等),然后试用了一些不同的asynchronous图像下载器,这一出来是最好的
希望能帮助到你