Ответ 1
фотографии SDWebImage
README Раздел говорит, как использовать его в своем приложении.
У меня есть 50 пользовательских ячеек в моем UITableView
. Я хочу отображать изображение и метку в ячейках, где я получаю изображения с URL-адресов.
Я хочу делать ленивую загрузку изображений, поэтому пользовательский интерфейс не замерзает во время загрузки изображений. Я попытался получить изображения в отдельных потоках, но я должен загружать каждое изображение каждый раз, когда ячейка снова становится видимой (в противном случае повторное использование ячеек показывает старые изображения). Может кто-нибудь, пожалуйста, скажите мне, как дублировать это поведение.
фотографии SDWebImage
README Раздел говорит, как использовать его в своем приложении.
Там есть хороший официальный пример здесь от Apple: LazyTableImages Я думаю, вы найдете правильный подход там....
Попробуйте AFNetworking класс, загрузите этот класс по этой ссылке https://github.com/AFNetworking/AFNetworking. Добавьте в проект весь класс AFNetworking. Затем просто импортируйте эту категорию
#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview.
Затем в cellForRowAtIndexPath:, как показано ниже
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil)
{
cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
[cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]];
cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
Загрузите свое изображение для изображения в окне UITableviewcell асинхронно. Он не будет загружаться снова и снова, пока пользователь просматривает Tableview, потому что он также имеет кеш. Как только изображение загрузится, сохраните изображение с помощью ключа вашего изображения. Я надеюсь, что это будет полезно для вас.
Я создал бесплатную библиотеку, разработанную именно для этого... HJCache. Он очень прост в использовании. iphone-image-cache
Я предлагаю перейти к NSOperation и делать все, что вам нужно, в другом потоке.
Это класс, который я написал для загрузки изображения:
- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url {
if(self = [super init]) {
if(url == nil || [url isEqualToString:@""])
return nil;
target = trgt;
action = sel;
imgURL = [[NSURL alloc] initWithString: url];
}
return self;
}
- (void)main {
[NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
}
- (void)loadImage {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *img = [UIImage imageNamed: @"default_user.png"];
if(![[imgURL absoluteString] isEqualToString: @"0"]) {
NSData *imgData = [NSData dataWithContentsOfURL: imgURL];
img = [UIImage imageWithData: imgData];
}
if([target respondsToSelector: action])
[target performSelectorOnMainThread: action withObject: img waitUntilDone: YES];
[pool release];
}
- (void)dealloc {
[imgURL release];
[super dealloc];
}
Надеюсь, что это поможет!
Вы также можете попробовать EGOImageLoading. Существует также демонстрация, в которой показано, как ее использовать.
вы можете использовать кнопку изображения эго. Вы можете загружать файлы кнопок изображения эго из github... добавить в свой проект....
измените класс "кнопка изображения эго" на изображении в вашем xib...
ленивая загрузка называется синхронным запросом.
Изображение эго называется асинхронным запросом. изображение эго не дожидаясь ответа.. отображать все изображения за один раз..
Может быть, вы можете попробовать ALImageView. Это намного проще, чем SDWebImage. Вам нужны только два исходных файла (ALImageView.h/ALImageView.m). Вы можете повторно использовать представление изображения для перезагрузки разных URL-адресов в ячейке tableview.
Существует также хорошая демонстрация.
вы можете попробовать lazyTableImages,
Я настроил lazyTableImages этот проект в очень простой (customizeLazyTableImages) и удалил все дополнительные коды с помощью некоторых статических URL-адресов и заголовков, только это загружать изображения очень плавно и кэшировать их
Я думаю, что есть другой способ решить эту проблему, если вы хотите загрузить это изображение, а затем в начале представления, которое означает
когда загружается -(void)loadView
, затем просто выделите эти изображения и перенесите их в nsarray
теперь, когда загружается ячейка таблицы, затем сделайте вид в ячейке таблицы и в соответствии с indexPath.row
просто замените эти изображения nsarray
в это представление в качестве фонового изображения или сделать подзаголовок этих изображений в этом новом представлении таблицы с использованием индекса nsarray
и indexPath.row
ячейки tableview.
Вы можете использовать очередь NSOperation или GCD для загрузки изображений в фоновом режиме.
Если вы не хотите загружать изображения снова и снова, вы можете использовать NSCache или файловую систему для хранения изображений.
Я не знаю ни одного встроенного способа выполнить это, но похоже, что у вас уже есть что-то, работающее с другим потоком.
Предполагая, что ваша единственная оставшаяся проблема теперь недействительна для содержимого ячейки, когда она возвращается в поле зрения, вы должны посмотреть:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
Внедряя этот метод делегата, вы можете проверить содержимое ячейки перед ее рисованием, чтобы узнать, нужно ли новое содержимое. Если это произойдет, вы можете очистить содержимое ячеек и снова запустить повторную загрузку.
Вы также можете рассмотреть возможность размещения некоторого кода.