Как вернуть объект ответа, используя AFJSONRequestOperation
Я пытаюсь получить данные о погоде с помощью AFJSONRequestOperation
, Проблема в том, что я не могу вернуть объект после завершения запроса. Кто-нибудь знает, как это сделать?
Моя текущая реализация
- (NSDictionary *)getCityWeatherData:(NSString*)city
{
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://free.worldweatheronline.com/feed/weather.ashx?key=xxxxxxxxxxxxx&num_of_days=3&format=json&q=%@", city]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSDictionary *data = [[JSON objectForKey:@"data"] objectForKey:@"weather"];
return data;
} failure:nil];
[operation start];
}
1 ответ
Есть способ, которым вы можете сделать это, в некотором смысле. Вместо того, чтобы использовать традиционный метод возврата, вы можете сделать так, чтобы вызывающая сторона передавала блок в качестве параметра, а затем вы можете вызывать этот блок внутри вашего успеха и неудачи. AFJSONRequestOperation
блоки.
Вот пример из моего кода:
- (void)postText:(NSString *)text
forUserName:(NSString *)username
withParameters:(NSDictionary *)parameters
withBlock:(void(^)(NSDictionary *response, NSError *error))block
{
NSError *keychainError = nil;
NSString *token = [SSKeychain passwordForService:ACCOUNT_SERVICE account:username error:&keychainError];
if (keychainError) {
if (block) {
block([NSDictionary dictionary], keychainError);
}
} else {
NSDictionary *params = @{TEXT_KEY : text, USER_ACCESS_TOKEN: token};
[[KSADNAPIClient sharedAPI] postPath:@"stream/0/posts"
parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
if (block) {
block(responseObject, nil);
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
if (block) {
block([NSDictionary dictionary], error);
}
}];
}
}
Я называю это так:
[[KSADNAPIClient sharedAPI] postText:postText
forUserName:username
withParameters:parameters
withBlock:^(NSDictionary *response, NSError *error)
{
// Check error and response
}