我试图以懒惰模式加载我的uitableviewcells的图像。
我试图以最简单的方式做到这一点,我看到了很多例子,但他们的目的远远超出了我的目的。
这就是我目前正在做的事情,它不起作用:
// Configure the cell...
Info *info = [self.Array objectAtIndex:indexPath.row];
cell.textLabel.text = info.name;
cell.detailTextLabel.text = info.platform;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
//The image is downloaded in asynchronous
NSBlockOperation *downloadingImgBlock = [NSBlockOperation blockOperationWithBlock:^{
NSString* imageURL = info.imgURL;
NSData* imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:imageURL]];
cell.imageView.image = [UIImage imageWithData:imageData];
}];
[self.queue addOperation:downloadingImgBlock];
为什么它不起作用?它怎么会起作用?
答案 0 :(得分:5)
男,AsyncImageView是你的朋友!只需设置图片网址,即可为您处理所有内容,下载,缓存。太棒了。
答案 1 :(得分:1)
请尝试以下代码
......
__block UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
__block UIImage *img;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString: imageURL]]];
dispatch_async(dispatch_get_main_queue(),^{
cell.imageView.image = img;
}
});
});
......
答案 2 :(得分:1)
使用第三方库源代码是最简单的,但是这里是你如何在代码中完成它。您希望将NSMutableArray
作为.h
中的属性或.m
的顶部属性,如下所示:
@implementation viewController{
NSMutableArray *picList;
}
并在-initWithCoder:
或者,无论你是什么初始的重载:
picList = [[NSMutableArray alloc] init];
<{1>}中的(fullPicURL是网址):
– tableView:cellForRowAtIndexPath:
其中if([self imageExists:fullPicURL]){
shoePic = [picList objectForKey:fullSmallPicURL];
} else {
NSURL *picURL = [NSURL URLWithString:fullPicURL];
shoePic = [UIImage imageWithData:[NSData dataWithContentsOfURL:picURL]];
NSDictionary *thisImage = [NSDictionary dictionaryWithObject:shoePic forKey:fullSmallPicURL];
[cachedImages addEntriesFromDictionary:thisImage];
}
是您编写的函数,用于检查字典的URL。对象是图片本身,关键是网址。然后你做-imageExists:
,或者你想要调用它的任何东西,你就完成了缓存。要以异步方式加载它们,请执行以下操作:
cell.image = showPic;
并在fetchedData结尾处:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:shoes];
[self performSelectorOnMainThread:@selector(fetchedShoeData:) withObject:data waitUntilDone:YES];
});
然后确保编辑[self.tableView reloadData];
以便在必要时进行更改。可能需要做一些其他事情才能让它100%工作,让我知道
答案 3 :(得分:0)
尝试这个,我总是使用这个方案异步加载图像:
(我没有找到最简单的方法。)
- (void)inAnyMethod {
// ...
void (^blockLoadPhoto)() = ^{
UIImage *_imageTemporary = [UIImage imageNamed:@"..."];
if (_imageTemporary) {
[self performSelectorOnMainThread:@selector(setPhoto:) withObject:_imageTemporary waitUntilDone:true];
}
};
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), blockLoadPhoto);
// ...
}
- (void)setPhoto:(UIImage *)photo {
// do something with the loaded image
}
答案 4 :(得分:0)
我终于设法用以下方式设置图像:
– performSelectorOnMainThread:withObject:waitUntilDone:
下载图片后