iPhone SDK: viewDidLoad () ve una NSArray vacía, pero está poblada en un método delegado (MGTwitterEngine)
-
13-09-2019 - |
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!
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.