Pregunta

Ok, tengo una UITableView con UITableViewCells personalizadas que contienen cada uno un UIImageView cuyas imágenes están siendo descargados de forma asíncrona a través de un NSURLConnection. Todas las cosas bastante estándar ...

El problema es que, cuando los rollos de mesa, las nuevas imágenes se descargan en el fondo correctamente, pero sin fundir hasta que la mesa deja de moverse.

¿Cómo consigo la mesa para hacer que su contenido incluso cuando se está moviendo? Gracias.

- ACTUALIZACIÓN -

Después de un vistazo más de cerca, estoy encontrando que los métodos NSURLConnection delegados no están disparando hasta que la mesa se detiene. No sé por qué. Cualquier ayuda sería grande.

¿Fue útil?

Solución

La razón los mensajes de delegado conexión no están disparando hasta que se detiene el desplazamiento se debe a que durante el desplazamiento, el bucle de ejecución está en UITrackingRunLoopMode. Por defecto, en sí mismo NSURLConnection horarios NSDefaultRunLoopMode solamente, por lo que no reciben ningún mensaje mientras se desplaza.

Aquí es cómo programar la conexión en los modos "comunes", que incluye UITrackingRunLoopMode:

NSURLRequest *request = ...
NSURLConnection *connection = [[NSURLConnection alloc]
                               initWithRequest:request
                               delegate:self
                               startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
            forMode:NSRunLoopCommonModes];
[connection start];

Tenga en cuenta que usted tiene que especificar startImmediately:NO en el inicializador, que parece ir en contra de la documentación de Apple que sugiere que puede cambiar los modos de bucle de ejecución, incluso después de que haya comenzado.

Otros consejos

Usted debe leer sobre NSRunLoop. Sospecho que, durante el desplazamiento, el bucle de ejecución se ejecuta en NSEventTrackingRunLoopMode y el NSURLConnection no está incluido en ese modo. Probablemente se podría obtener en torno a esta llamando de NSURLConnection scheduleInRunLoop:. ForMode :, por lo que la descarga puede ocurrir durante el desplazamiento

Esto probablemente afectará el rendimiento de desplazamiento, que es probablemente la razón para el modo de bucle de ejecución separada en el primer lugar. Pero probarlo y ver cómo se siente!

Si envuelve su imagen descarga y actualización en un NSOperation, las actualizaciones va a pasar como la mesa con vista al rollos.

Otro beneficio de NSOperation, es que se puede cancelar la operación como la célula se desliza fuera de la pantalla. Se sentirá mucho más sensible para el usuario .. especialmente si desplazarse una larga lista rápidamente. La tecnología hablar de Apple este año animó a esta técnica.

Si las listas no son tan larga, o que prefiera que continúen carga, puede manipular las prioridades NSOperation lugar.

En primer lugar ... su conexión probablemente ni siquiera se empieza hasta que llegar al mainRunLoop y ahí es donde también se está procesando la animación de desplazamiento.

Me encontré con el mismo problema y lo arregló diciendo a las conexiones de las imágenes para comenzar inmediatamente con la creación.

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:wrapper.request delegate:wrapper];

    [connection start];

En la rutina de finalización en la que recibe la imagen y ajusta la cell.imageView.image a la imagen recibida, usted debe comprobar para ver si esta célula pertenece a una de las celdas que actualmente se muestran en la tabla ... y si así que llame [tableView reloadData].

    NSInteger itemIndex = theIndexInTheRowDataOfTheCellYouStuffedTheImage

    NSArray *indicies = [_tableView indexPathsForVisibleRows];
    NSUInteger rows = indicies.count;

    if (rows > 0 &&
        itemIndex >= ((NSIndexPath *)[indicies objectAtIndex:0]).row &&
        itemIndex <= ((NSIndexPath *)[indicies objectAtIndex:rows - 1]).row)
    {       
        [_tableView reloadData];
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top