iPhone SDK: viewDidLoad () vede un NSArray vuota, ma è popolato in un metodo delegato (MGTwitterEngine)
-
13-09-2019 - |
Domanda
Questo è probabilmente ovvio, ma io sono un po 'di un newbie e hanno trascorso ore a cercare di capire questo.
In viewDidLoad () ho una chiamata a una funzione su un (oggetto personalizzato) oggetto MGTwitterEngine, con un ingresso. Se la richiesta (a Twitter, in questo caso) ha successo, chiama un metodo delegato appropriato.
In viewDidLoad (), è come questo:
[myTwitterEngine getSearchResultsForQuery:@"#quote" sinceID:0 startingAtPage:0 count:10];
Il metodo delegato chiama in caso di una richiesta di ricerca di successo è simile al seguente:
- (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]);
}
}
La cosa che non riesco a capire è questo: alla fine, dove dico "Va bene, il lavoro è qui", è chiaro che self.messages (un NSArray) viene compilato con le informazioni che voglio
.Tuttavia, self.messages è vuoto se chiamo nuovamente in viewDidLoad () dopo il primo metodo. Questo è quello che ho fatto in viewDidLoad ():
[myTwitterEngine getSearchResultsForQuery:@"#quote"];
NSLog(@"\n Before Or After? \n");
NSLog(@"From viewDidLoad: %@", [[self.messages objectAtIndex:13] theMessage]);
I risultati sono strani. Il risultato della prima NSLog viene prima i risultati del metodo delegato. Ecco l'output della console:
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
Alla fine voglio utilizzare i messaggi matrice come origine dati per un tavolo. Come potrei accedere a questa variabile all'interno del metodo delegato altrove nella realizzazione?
Qualcuno sa il motivo per cui delegare l'output del metodo delegato arriva alla fine, anche se ho chiamato la funzione reale prima della prima-o-dopo NSLog?
Qualsiasi aiuto apprezzato!
Soluzione
Non so nulla di MGTwitterEngine, ma chiaramente -getSearchResultsForQuery:
è un metodo asincrono; tornerà immediatamente e chiamare il metodo delegato qualche tempo dopo, quando i risultati sono disponibili.
Il vostro array è vuoto -viewDidLoad
perché i risultati non sono stati ancora ricevuto. Inoltre, l'array è sempre essere vuoto nel -viewDidLoad
perché il metodo delegato non può essere chiamato fino a tornare il controllo al passante della corsa.