2013-08-31 4 views
5
-(void)getDataFromServer: (NSMutableDictionary *)dict 
{ 

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/doSomething",MainURL ]]; 
[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]]; 

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:nil parameters:dict]; 

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
{ 
    _myArray = JSON; 
    [_myTableView reloadData]; //Or do some other stuff that are related to the current `ViewController` 
} 
failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON) 
{ 
    NSLog(@"request: %@",request); 
    NSLog(@"Failed: %@",[error localizedDescription]); 
}]; 

[httpClient enqueueHTTPRequestOperation:operation]; 
} 

Я использую вышеуказанный код в 7 разных местах в одном из моих приложений. Точный фрагмент кода дублируется в 7 моих ViewControllers. То, что я обычно использовал, - это использовать метод, который я хочу использовать в классе NSObject, и выделять его и использовать, когда мне это нужно, но поскольку это выше, Async и использование блоков, я не могу просто вернуть JSON в ViewController, который вызвал это и нужно скопировать & вставить вышеупомянутый метод в каждом ViewController мне нужно это.Передача блоков методу AFNetworking?

Моя цель состоит в том, чтобы иметь выше только в одном месте в моем приложении и все еще быть в состоянии назвать его из разных ViewControllers вокруг моего приложения и получить нужные мне данные. Я бы хотел избежать использования наблюдателя, такого как NSNotification или KVO, и ищет более элегантное решение. После некоторого чтения я заметил возможность пропускать блоки вокруг. Это возможное решение с вышесказанным? Будет оценен пример кода.

+1

В дополнение к ответу Габриэле ниже, вы можете избежать поворота нового AFHTTPClient для каждого запроса. –

+0

Я точно редактировал свой ответ. Спасибо за примечание. –

ответ

6

Факторизуем API вызова к чему-то вроде

+ (void)getDataFromServerWithParameters:(NSMutableDictionary *)params completion:(void (^)(id JSON))completion failure:(void (^)(NSError * error))failure { 
    NSString * path = @"resources/123"; 
    NSMutableURLRequest *request = [self.httpClient requestWithMethod:@"POST" path:path parameters:params]; 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
     if (completion) 
      completion(JSON); 
    } failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON) { 
     if (failure) 
      failure(error); 
    }]; 

    [httpClient enqueueHTTPRequestOperation:operation]; 
} 

Вы можете поместить этот метод в служебный класс как XYAPI и просто вызвать его из контроллеров, как

[XYAPI getDataFromServer:params completion:^(id JSON){ 
    // do something, for instance reload the table with a new data source 
    _myArray = JSON; 
    [_myTableView reloadData]; 
} failure:^(NSError * error) { 
    // do something 
}]; 

Кроме того, вам не нужно для создания нового AFHTTPClient по каждому запросу. Настройте и используйте общий в классе XYAPI. Что-то вроде

+ (AFHTTPClient *)httpClient { 
    static AFHTTPClient * client = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://foo.com/api/v1/"]]; 
     [AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]]; 
    }); 
    return client; 
} 

Обратите внимание, что эта реализация уже используется в приведенном выше примере.
self в контексте метода класса - это сам класс, поэтому self.httpClient действительно разрешен во время выполнения как [XYAPI httpClient].

+0

Отличный ответ! Очень подробный и красиво написанный. Я проверю его и отчитаю. Большое спасибо. – Segev

Смежные вопросы