iPhone SDK: viewDidLoad () vê um NSArray vazio, mas é povoada em um método delegado (MGTwitterEngine)
-
13-09-2019 - |
Pergunta
Este é provavelmente óbvio, mas eu sou um pouco de um novato e ter passado horas tentando descobrir isso.
Na viewDidLoad () Eu tenho uma chamada para uma função em um (objeto personalizado) MGTwitterEngine objeto, com uma entrada. Se o pedido (Twitter, neste caso) for bem sucedida, ele chama um método delegado apropriado.
Na viewDidLoad (), é assim:
[myTwitterEngine getSearchResultsForQuery:@"#quote" sinceID:0 startingAtPage:0 count:10];
O método delegado que chama em caso de uma bem sucedida olhares pedido da busca como este:
- (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]);
}
}
A coisa que eu não consigo entender é o seguinte:. No final, onde eu digo "Ok, o trabalho é aqui", é claro que self.messages (um NSArray) é preenchida com informações Marcar
No entanto, self.messages está vazia, se eu chamá-lo novamente em viewDidLoad () após o primeiro método. Isto é o que eu fiz no viewDidLoad ():
[myTwitterEngine getSearchResultsForQuery:@"#quote"];
NSLog(@"\n Before Or After? \n");
NSLog(@"From viewDidLoad: %@", [[self.messages objectAtIndex:13] theMessage]);
Os resultados são estranhas. O resultado da primeira NSLog vem antes de os resultados do método delegado. Aqui está a saída do 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
Eventualmente, eu quero usar a mensagens matriz como uma fonte de dados para uma tabela. Como eu poderia acessar esta variável de dentro da outra parte método delegado na implementação?
Alguém sabe por que delegar a saída do método delegado vem no final, embora eu tenha chamado a função real antes do antes-ou-após NSLog?
Qualquer ajuda apreciada!
Solução
Eu não sei nada de MGTwitterEngine, mas claramente -getSearchResultsForQuery:
é um método assíncrono; ele irá retornar imediatamente e chame o método delegado, algum tempo depois, quando os resultados estão disponíveis.
Sua matriz é vazia em -viewDidLoad
porque os resultados não foram recebidos ainda. Além disso, a matriz irá sempre estar vazio em -viewDidLoad
porque seu método delegado não pode ser chamado até que você retornar o controle para o loop de execução.