iPhone SDK: viewDidLoad () voit un NSArray vide, mais il est peuplé d'une méthode déléguée (MGTwitterEngine)

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

Question

Ceci est probablement évident, mais je suis un peu un débutant et ont passé des heures à essayer de comprendre.

Dans viewDidLoad () J'ai un appel à une fonction sur un objet MGTwitterEngine (objet personnalisé), avec une entrée. Si la demande (à Twitter, dans ce cas) est un succès, il appelle une méthode appropriée délégué.

Dans viewDidLoad (), il est comme ceci:

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

La méthode déléguée appelle en cas d'une demande de recherche réussie ressemble à ceci:

- (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 chose que je ne peux pas comprendre est la suivante: A la fin, où je dis « D'accord, le travail est là », il est clair que self.messages (NSArray) est rempli avec les informations que je veux

.

Cependant, self.messages est vide si je l'appelle à nouveau dans viewDidLoad () après la première méthode. Voilà ce que je l'ai fait dans viewDidLoad ():

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

Les résultats sont étranges. Le résultat de la première NSLog vient avant les résultats de la méthode des délégués. Voici la sortie de la 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

Finalement, je veux utiliser les messages tableau comme source de données pour une table. Comment pourrais-je accéder à cette variable à partir de la méthode déléguée ailleurs dans la mise en œuvre?

Quelqu'un sait pourquoi déléguer la sortie de la méthode déléguée vient à la fin même si je l'ai appelé la fonction réelle avant l'avant-ou après NSLog?

Toute aide appréciée!

Était-ce utile?

La solution

Je ne sais rien de MGTwitterEngine, mais clairement -getSearchResultsForQuery: est une méthode asynchrone; il retournera immédiatement et appelez votre méthode déléguée quelque temps plus tard, lorsque les résultats sont disponibles.

Votre tableau est vide en -viewDidLoad parce que les résultats ne sont pas encore reçu. En outre, votre tableau sera toujours vide dans -viewDidLoad parce que votre méthode de délégué ne peut pas être appelé jusqu'à ce que vous revenez à votre commande boucle d'exécution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top