iPhone SDK: viewDidLoad () vede un NSArray vuota, ma è popolato in un metodo delegato (MGTwitterEngine)

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

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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top