2009-12-06 5 views
0

Cela est probablement évident, mais je suis un peu un débutant et j'ai passé des heures à essayer de comprendre cela.iPhone SDK: viewDidLoad() voit un NSArray vide, mais il est rempli dans une méthode déléguée (MGTwitterEngine)

Dans viewDidLoad() J'ai un appel à une fonction sur un objet MGTwitterEngine (objet personnalisé), avec une entrée. Si la requête (sur Twitter, dans ce cas) aboutit, elle appelle une méthode de délégation appropriée.

En 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 À la fin, où je dis «Ok, le travail est ici», il est clair que self.messages (un NSArray) est peuplé d'informations que je veux.

Toutefois, self.messages est vide si je l'appelle à nouveau dans viewDidLoad() après la première méthode. C'est ce que j'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 du premier NSLog vient avant les résultats de la méthode du délégué. 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 Array comme source de données pour une table. Comment accéder à cette variable depuis la méthode déléguée ailleurs dans la mise en œuvre? Quelqu'un sait-il pourquoi déléguer la sortie de la méthode déléguée vient à la fin même si j'ai appelé la fonction réelle avant le NSLog avant-après?

Toute aide appréciée!

Répondre

0

Je ne connais rien à MGTwitterEngine, mais clairement -getSearchResultsForQuery: est une méthode asynchrone; il reviendra immédiatement et appellera votre méthode de délégué plus tard quand les résultats seront disponibles. Votre tableau est vide dans -viewDidLoad car les résultats n'ont pas encore été reçus. En outre, votre tableau sera toujours être vide dans -viewDidLoad car votre méthode de délégation ne peut pas être appelée tant que vous n'avez pas renvoyé le contrôle à votre boucle d'exécution.

+0

Merci! Mon approche était complètement fausse. J'avais l'impression que viewDidLoad() continuait sans les données, mais ne savait pas comment éventuellement mettre à jour ma table avec lui. Dans un moment de révélation soudaine, j'ai réalisé que je pouvais simplement faire un [self.tableView reloadData]. Et c'est fait! Encore une fois, merci! – Parimal

Questions connexes