iPhone SDK: viewDidLoad () vê um NSArray vazio, mas é povoada em um método delegado (MGTwitterEngine)

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

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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top