В Objective-C верните что-то, что должно подождать, прежде чем это будет сделано - PullRequest
1 голос
/ 11 марта 2012

Рассмотрим следующий код, включающий SpecialRequest, в котором есть член result, который не заполняется сразу:

- (NSArray *)getXboxSizedArray {
   SpecialRequest *request = [SpecialRequest request];
   request.someParam = 11; //and so forth...
   [request start];
}

И скажем, что есть обратный вызов для requestFinished:

- (void)requestFinished:(SpecialRequest *)request {
   //hooray!
}

Я хочу вернуть значение request.result, но, конечно, только после того, как запрос будет выполнен (что я узнаю из -(void)requestFinished. Как мне это сделать?

Редактировать. Обратите внимание, что я попытался поместить выражение return в блок и потерпел неудачу.

Редактировать 1: Вот пример плохого и нерабочего кода, если вы заинтересованы:

- (NSString *)getAllDogFoodBrand {
    __unsafe_unretained __block ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"some_url"]];
    request.delegate = self;
    [request setCompletionBlock:^{
        [self.delegate objectControllerDidFinishRequestWithStatus:request.responseStatusMessage];
        //return request.responseString; <-- this line makes compiler :(
    }];
    [request startAsynchronous];
}

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Другим подходом может быть создание класса-оболочки для вашего запроса с помощью метода, который принимает параметр блока. Параметр блока может быть сохранен в переменной экземпляра (обычно это свойство copy), и после завершения запроса блок завершения, сохраненный в переменной экземпляра, может быть вызван из метода обратного вызова -requestFinished:. На мой взгляд, это более аккуратный подход по сравнению с использованием делегатов.

0 голосов
/ 11 марта 2012

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

Также вы можете использовать KVC с KVO.Проверьте здесь о подходах здесь: Руководство по программированию наблюдения значения ключа

...