iphone - rojo - Imágenes de carga lenta en UITableView
mi iphone no reconoce el cargador (12)
Tengo unas 50 celdas personalizadas en mi UITableView
. Quiero mostrar una imagen y una etiqueta en las celdas donde obtengo las imágenes de las URL.
Quiero hacer una carga lenta de imágenes para que la IU no se congele mientras se cargan las imágenes. Traté de obtener las imágenes en hilos separados, pero tengo que cargar cada imagen cada vez que una celda vuelve a ser visible (de lo contrario, la reutilización de las celdas muestra imágenes antiguas). ¿Puede alguien decirme cómo duplicar este comportamiento?
Aquí hay un buen ejemplo oficial de Apple: LazyTableImages . Creo que encontrarás el enfoque correcto allí ...
Creo que hay otra forma de resolver ese problema si quieres cargar esa imagen, entonces, al comienzo de la vista eso significa
cuando -(void)loadView
está cargando, simplemente asigne estas imágenes y nsarray
a nsarray
ahora cuando la celda de la tabla se está cargando, luego haga su vista en la celda de la tabla y de acuerdo con indexPath.row
simplemente reemplace estas imágenes de nsarray
en esa vista como una imagen de fondo o hacer una subvista de estas imágenes en esa nueva vista de tablecell usando el índice indexPath.row
y indexPath.row
de la celda tableview.
Hice una biblioteca gratuita diseñada solo para esto ... HJCache. Es muy fácil de usar. iphone-image-cache
No conozco ninguna forma integrada para lograr esto, pero parece que ya tienes algo trabajando con otro hilo.
Suponiendo que el único problema que le queda ahora es invalidar el contenido de una celda cuando se vuelva a ver, debería observar:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
Al implementar este método delegado, puede verificar el contenido de la celda antes de que se dibuje para ver si necesita nuevos contenidos. Si lo hace, entonces puede vaciar el contenido de las celdas y volver a activar su carga enhebrada.
También podría considerar publicar algún código.
Prueba la clase AFNetworking descarga esta clase en este enlace https://github.com/AFNetworking/AFNetworking . Agregue la clase AFNetworking en su proyecto. Luego solo importe esta categoría
#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview.
Luego en cellForRowAtIndexPath: poner como a continuación
-(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;
}
Esto descarga su Imagen para imageView en la UITableviewcell de forma asincrónica. No se descargará una y otra vez mientras el usuario desplaza la vista de tabla, porque también tiene caché. Una vez que la imagen se descarga, guarde la imagen con la clave de su imageUrl. Espero que sea útil para ti
Puede usar la cola NSOperation o GCD para cargar imágenes en segundo plano.
Si no desea cargar imágenes una y otra vez, puede usar NSCache o el sistema de archivos para almacenar las imágenes.
Sugeriría ir a una NSOperation y hacer lo que necesites en otro hilo.
Esta es una clase que escribí para la carga de imágenes:
- (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];
}
¡Espero que ayude!
Tal vez puedas probar ALImageView . Es mucho más simple que SDWebImage. Solo necesitas dos archivos de origen ( ALImageView.h / ALImageView.m ). Puedes reutilizar la vista de la imagen para volver a cargar diferentes URL en una celda de tabla.
- Soporta memoria caché local y de memoria;
- Apoyar a los titulares de lugares;
- Soporte toque táctil (objetivo-acción);
- Esquina de soporte para la vista de la imagen;
También hay una buena demostración.
También puedes probar EGOImageLoading . También hay una demostración, que muestra cómo usarla.
checkout SDWebImage
La sección README dice, cómo usarlo en su aplicación.
puede usar el botón de imagen del ego ... puede descargar los archivos del botón de imagen del ego de github ... agregar en su proyecto ...
cambie la clase "botón de imagen del ego" en la vista de la imagen en su xib ...
La carga diferida se llama solicitud sincrónica.
la imagen del ego se llama solicitud asincrónica. imagen del ego no espere respuesta ... mostrar todas las imágenes a la vez ..
puedes probar este lazyTableImages ,
He personalizado lazyTableImages este proyecto en una muy simple (personalizar LazyTableImages) y eliminé todos los códigos adicionales con algunas URL estáticas y títulos, solo que esto es cargar imágenes muy fácilmente y almacenarlas en caché