Cocoa-Touch: performSelectorOnMainThread: comportamiento extraño + bloqueo

Tengo una situación en la que estoy flojo cargando imágenes de www.
Es una lista de elementos, cuando se toca un elemento, se empuja una vista detallada a un controlador de navegación.

En esa vista detallada, el elemento tiene una imagen, que primero es una imagen predeterminada, y quiero comenzar a cargar su imagen desde una URL.

Entonces, lo que hago es crear un objeto que, una vez que se inicializa, separa un nuevo hilo que a su vez carga el contenido y luego notifica a mi vista que los datos están cargados:

// in MyLoader:
- (MyLoader *)initWithUrl:(NSURL *)url requester:(id)requester {
    self.url = url;
    self.requester = requester; // both are nonatomic, retain properties
    [self performSelectorInBackground:@selector(loadIt) withObject:nil];
}

- (void)loadIt {
    NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];
    NSData *data = [NSData dataWithContentsOfURL:url];
    [requester performSelectorOnMainThread:@selector(dataReady) withObject:data waitUntilDone:YES;
    [arp release];
}

// in MyRequester:
- (void)somewhere {
    MyLoader *loader = [[[MyLoader] alloc] initWithUrl:someUrl requester:self] autorelease];
    // then I retain loader somewhere, it's more complicated but I have verified that it's properly retained.
}

Algunas notas:

Primero pensé que podría haber un problema con algunas de las variables. Puse un punto de ruptura justo antesperformSelectorOnMainThread y confirmó quedata yrequester ambos estaban bien.

Luego pensé que se debía a que pasaba el NSData a través de los hilos, así que cambiéwithObject:nil. Todavía se estrella.

Cuando investigué más, el accidente fue muy extraño. Yo especifiquewaitUntilDone:YES, He puesto un punto de quiebre en elrequesteresdataReady. Pero elperformSelectorOnMainThread la llamada retorna (alcanza el punto de interrupción después de ella) mientras no alcanza el punto de interrupción dentrodataReady. Por cierto,- (void)dataReady:(NSData*)El cuerpo de por ahora solo contieneint x = 1; (colocar un punto de ruptura en). Además, he intentado configurarwaitUntilDone:NO, todavía se bloquea.

El selector no se realiza (no se alcanza el punto de interrupción), pero el bloqueo se produce poco después de la llamada.

¿Alguien tiene alguna idea de lo que está mal?

Esto es obvio, pero para ser claro, si solo comento el[requester performSelectorOnMainThread... parte, no se bloquea.

Además, aquí hay un seguimiento de la pila, pero no es útil en absoluto.

#0  0x00a71004 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___ ()
#1  0x93436e3b in objc_exception_throw ()
#2  0x0028aca6 in __NSThreadPerformPerform ()
#3  0x00a098e1 in CFRunLoopRunSpecific ()
#4  0x00a08c48 in CFRunLoopRunInMode ()
#5  0x0005a78d in GSEventRunModal ()
#6  0x0005a852 in GSEventRun ()
#7  0x0168a003 in UIApplicationMain ()
#8  0x000028d4 in main (argc=1, argv=0xbffff100) at /Users/myName/Document/appName/main.m:14

Respuestas a la pregunta(1)

Su respuesta a la pregunta