2012-04-16 3 views
-1

В моем приложении мне нужно вызвать функцию, которая в свою очередь вызывает многие функции. Проблема в том, что я вызвал функцию getweather, и она запускает startprocess, после чего процесс завершается. Метод processCompleted вызывается rssparser, и значение доступно в конце метода processCompleted.Ожидание функции для возврата значения

-(void) getWeather: (NSDictionary *) dictionary { 
    _rssParser = [[BlogRssParser alloc]init]; 
    self.rssParser.address = addressInterestedIn; 
    self.rssParser.delegate = self; 
    [[self rssParser]startProcess]; 
} 

//Delegate method for blog parser will get fired when the process is completed 

-(void)processCompleted 
{ 
    NSLog(@"the rssItems array is %@", [[[self rssParser]rssItems] description]); 
    int woeid = [[[[self rssParser] rssItems] objectAtIndex:0] intValue]; 
    // get weather update from yahoo 
    NSLog(@"temperature option %d", [[[NSUserDefaults standardUserDefaults] objectForKey:@"temperature"] intValue]); 
    SCYahooWeatherParser *parser = [[SCYahooWeatherParser alloc] initWithWOEID:woeid weatherUnit: [[[NSUserDefaults standardUserDefaults] objectForKey:@"temperature"] intValue]]; 
    //parse the returned xml from yahoo 
    SCWeather *result = [parser parse]; 
    [parser release]; 
    NSLog(@"the conditionDataDict is %@", [result.conditionDataDict description]); 
} 

Как получить значение, возвращаемое методом processCompleted, потому что я назвал getWeather функции.

ответ

1

В Objective C, так же как и в любом структурированном языке, когда вы вызываете функцию, которая возвращает значение как в

NSInteger x = [self yourFunction]; 
[self somethingElse:x]; 

следующая инструкция не выполняется, пока функция не возвращает значение. Другими словами, somethingElse не выполняется, пока ваша функция не закончилась и не вернула значение для x.

+0

если отредактирован вопрос. пожалуйста, проверь это. –

+0

Мой ответ остается тем же, пожалуйста, прочитайте полностью, вы не используете селекторов или фоновых потоков, поэтому возвращаемое значение всегда получается, нет необходимости синхронизировать функции. –

0

Вы можете использовать следующий метод и передать waitUntilDone как Да. Он будет ждать своей функции complete-

performSelectorOnMainThread:withObject:waitUntilDone: 

Есть еще несколько методов, доступных, вы можете обратиться NSObject класс - https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html

0

Если цепочка функций вызывается в главном потоке, ваше приложение должно автоматически дождитесь завершения процесса, прежде чем продолжить и выполните следующую операцию. Тогда вам не нужно ничего делать, чтобы достичь своей цели.

Обратите внимание: если ваш процесс очень тяжелый, ваше приложение замерзнет до конца. Это хороший пользовательский процесс, который может заблокировать ваше приложение в другом потоке.