iPhone SDK: viewDidLoad () ve una NSArray vacía, pero está poblada en un método delegado (MGTwitterEngine)

StackOverflow https://stackoverflow.com/questions/1854345

Pregunta

Este es probablemente obvio, pero yo soy un poco de un novato y han pasado horas tratando de resolver esto.

En viewDidLoad () Tengo una llamada a una función en un objeto MGTwitterEngine (objeto personalizado), con una entrada. Si la solicitud (a Twitter, en este caso) tiene éxito, se llama a un método delegado apropiado.

En viewDidLoad (), es la siguiente:

[myTwitterEngine getSearchResultsForQuery:@"#quote" sinceID:0 startingAtPage:0 count:10];

El método delegado que llama en caso de una solicitud de búsqueda con éxito es el siguiente:

- (void)searchResultsReceived:(NSArray *)searchResults forRequest:(NSString *)connectionIdentifier
{
    NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease];    

    if ([searchResults count] > 0)
    {
        for (int n=0; n < 15; n++) {

        NSDictionary *singleResult = [searchResults objectAtIndex:n];

        NSString *fromUser = [singleResult valueForKey:@"from_user"];
        NSString *text = [singleResult valueForKey:@"text"]; 

        Message *newMessage = [[Message alloc] initWithUsername:fromUser message:text];

        [tempArray addObject:newMessage];
        }

        self.messages = tempArray;

        // Okay, works here.
        NSLog(@"From delegate method: \n %@", [[self.messages objectAtIndex:13] theMessage]);
    }
}

Lo que no puedo entender es la siguiente: Al final, cuando digo "Está bien, el trabajo está aquí", está claro que self.messages (un NSArray) se rellena con información Marcar

.

Sin embargo, self.messages está vacía si llamo de nuevo en viewDidLoad () después de que el primer método. Esto es lo que he hecho en viewDidLoad ():

[myTwitterEngine getSearchResultsForQuery:@"#quote"];
NSLog(@"\n Before Or After? \n");
NSLog(@"From viewDidLoad: %@", [[self.messages objectAtIndex:13] theMessage]);

Los resultados son extraños. El resultado de la primera NSLog viene antes que los resultados del método delegado. Aquí está la salida de la consola:

2009-12-05 23:15:20.758 Entendu[54463:207] 
 Before Or After? 
2009-12-05 23:15:20.761 Entendu[54463:207] From viewDidLoad: (null)
2009-12-05 23:15:21.005 Entendu[54463:207] Request succeeded for connectionIdentifier = 92B2E7EC-AA2F-4301-812E-E8E5AEAF7035
2009-12-05 23:15:21.007 Entendu[54463:207] From delegate method: 
 RT @thankfulnotes: RT @felicelam It usually takes me more than three weeks to prepare a good impromptu speech. Mark Twain #quote

Finalmente quiero usar la matriz de mensajes como origen de datos para una tabla. ¿Cómo puede acceder a esta variable desde dentro del método delegado en la implementación en otros lugares?

Alguien sabe por qué delegar la salida del método delegado llega al final a pesar de que he llamado a la función real antes de que el antes o después NSLog?

Cualquier ayuda apreciada!

¿Fue útil?

Solución

No sé nada de MGTwitterEngine, pero claramente -getSearchResultsForQuery: es un método asíncrono; volverá inmediatamente y llame al método delegado algún tiempo más tarde, cuando los resultados están disponibles.

Su matriz está vacía en -viewDidLoad porque los resultados no se han recibido todavía. Por otra parte, la matriz será siempre estar vacío en -viewDidLoad debido a su método de delegado no puede ser llamado hasta que regrese a su control de bucle de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top