iPhone SDK:viewDidLoad() видит пустой NSArray, но он заполняется в методе делегата (MGTwitterEngine)

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

Вопрос

Это, наверное, очевидно, но я немного новичок и потратил часы, пытаясь понять это.

В viewDidLoad() у меня есть вызов функции объекта MGTwitterEngine (пользовательский объект) с вводом.Если запрос (в данном случае к Twitter) успешен, он вызывает соответствующий метод делегата.

В viewDidLoad() это выглядит так:

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

Метод делегата, который он вызывает в случае успешного поискового запроса, выглядит следующим образом:

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

Чего я не могу понять, так это:В конце, когда я говорю: «Хорошо, работа здесь», становится ясно, что self.messages (NSArray) заполнен необходимой мне информацией.

Однако self.messages будет пустым, если я снова вызову его в viewDidLoad() после первого метода.Вот что я сделал в viewDidLoad():

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

Результаты странные.Результат первого NSLog предшествует результатам метода делегата.Вот вывод консоли:

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

В конце концов я хочу использовать массив сообщений в качестве источника данных для таблицы.Как я могу получить доступ к этой переменной из метода делегата в другом месте реализации?

Кто-нибудь знает, почему делегирование вывода метода делегата происходит в конце, хотя я вызвал фактическую функцию до или после NSLog?

Любая помощь приветствуется!

Это было полезно?

Решение

Я ничего не знаю о MGTwitterEngine, но ясно -getSearchResultsForQuery: это асинхронный метод;он немедленно вернется и вызовет ваш метод делегата через некоторое время, когда результаты будут доступны.

Ваш массив пуст в -viewDidLoad потому что результаты еще не получены.Кроме того, ваш массив будет всегда быть пустым в -viewDidLoad потому что ваш метод делегата не может быть вызван до тех пор, пока вы не вернете управление циклу выполнения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top