iPhone SDK: viewDidLoad () sieht eine leere NSArray, aber es ist in einem Delegatmethode (MGTwitterEngine) bevölkert

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

Frage

Dieses

ist wohl offensichtlich, aber ich bin ein bisschen wie ein Neuling und habe stundenlang versucht, dies herauszufinden.

In viewDidLoad () Ich habe einen Aufruf eine Funktion auf einem MGTwitterEngine Objekt (benutzerdefiniertes Objekt), mit einem Eingang. Wird der Antrag (auf Twitter, in diesem Fall) erfolgreich ist, ruft sie eine geeignete Delegatmethode.

In viewDidLoad (), ist es wie folgt aus:

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

Die Delegatmethode es im Falle einer erfolgreichen Suche Anfrage ruft sieht wie folgt aus:

- (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]);
    }
}

Das, was ich kann nicht herausfinden, ist dies: Am Ende, wo ich sagen: „Okay, Arbeit ist hier“, ist es klar, dass self.messages (ein NSArray) mit Informationen gefüllt wird Ich möchte

.

Allerdings ist self.messages leer, wenn ich es wieder in viewDidLoad () nach der ersten Methode aufrufen. Das ist, was ich in viewDidLoad getan ():

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

Die Ergebnisse sind seltsam. Das Ergebnis des ersten NSLog kommt, bevor die Ergebnisse des Delegatmethode. Hier ist die Ausgabe der Konsole:

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

Schließlich möchte ich für eine Tabelle, die die Nachrichten Array als Datenquelle verwenden. Wie könnte ich Zugriff auf diese Variable aus dem Delegatmethode an anderer Stelle in der Umsetzung?

Wer weiß, warum die Ausgabe aus dem Delegatmethode delegieren kommt am Ende, obwohl ich die eigentliche Funktion, bevor das vor-oder-nach NSLog genannt habe?

Jede Hilfe willkommen!

War es hilfreich?

Lösung

Ich weiß nichts von MGTwitterEngine, aber deutlich -getSearchResultsForQuery: ist ein asynchrones Verfahren; es wird sofort zurückkehren und Ihre Delegatmethode einige Zeit später anrufen, wenn Ergebnisse verfügbar sind.

Ihr Array ist leer in -viewDidLoad, weil die Ergebnisse noch nicht eingegangen ist. Darüber hinaus wird das Array immer leer in -viewDidLoad weil Ihre Stellvertretung Methode nicht aufgerufen werden kann, bis Sie die Kontrolle über Ihre Laufschleife zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top