iphone - Fallo en el hilo de fondo en UIScrollview



objective-c multithreading (1)

Para mejorar el rendimiento, estoy creando subvistas para mi vista de desplazamiento en una secuencia de fondo y luego publicando el evento en la performSelectorOnMainThread principal usando performSelectorOnMainThread y agregando la vista a la vista de desplazamiento en ella y llevándola a la fuente. Sin embargo, a veces tengo un accidente.

Cuando compruebo esto en mi hilo de fondo.

if( nil == myView.view.superview)

¿Cómo puedo realizar este hilo de verificación seguro en el hilo de fondo? Si tengo que actuar en el hilo principal, entonces necesito cambiar mucho el diseño, por lo tanto, ¿puede haber una manera de publicarlo en el hilo principal y usar el valor de retorno? Estoy abierto a las alternativas en el mismo.

TIA,

Praveen S

EDITAR:

Implementé UIScrollview con paginación. Sin embargo, debido a problemas de rendimiento y para mejorar la capacidad de respuesta de la interfaz de usuario, me moví creando las subvistas en un hilo diferente usando

[self performSelectorInBackground:@selector(loadPages:) withObject:nil];

En las páginas de carga, hago lo siguiente

if( nil == myView.view.superview) 
{
Create the view
 [[self performSelectorOnMainThread:@selector(refreshViews:) myView.view waitUntilDone:YES];
}

En la vista de actualización, agrego la subvista a scrollview y la traigo al frente.

[myScrollView addSubview:views];
[myScrollView bringSubviewToFront:views];

Sin embargo, el agregado y el control de página funcionan bien. Desplazamiento está bien, bien, suave. Pero cuando me desplazo rápidamente (deslizo rápidamente la pantalla), la aplicación falla.

El depurador dice que el bloqueo está en obj_msgSend después de la verificación if en las páginas de carga.

EDITAR: Stack trace - Bueno, esta vez se bloqueó en el control @synchronized. He editado el registro de bloqueo para eliminar nombres específicos del proyecto por razones de seguridad, pero el seguimiento es el siguiente.

#0  0x33a06464 in objc_msgSend ()
#1  0x314d6984 in -[UIViewController _loadViewFromNibNamed:bundle:] ()
#2  0x314d5cb8 in -[UIViewController loadView] ()
#3  0x313d6226 in -[UIViewController view] ()
#6  0x00009920 in -[myViewController loadPages:] (self=0x12a2a0, _cmd=0x1eac1, abcd=0x0) at 
#7  0x302d9198 in -[NSThread main] ()
#8  0x302d2248 in __NSThread__main__ ()
#9  0x3110c88c in _pthread_start ()
#10 0x31101a90 in thread_start ()

UIKit no es seguro para subprocesos a menos que se indique específicamente lo contrario. No se admite la creación de vistas (y cargar plumillas) en el fondo; cualquier cosa que toque una UIView debe suceder en el hilo principal. Esto se aplica incluso antes de que su vista se haya agregado a una supervista.





uiscrollview