-(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个不同位置使用上述代码。我ViewControllers
中的7个代码中存在完整的代码块。我通常做的是将我想要在NSObject类中使用的方法放在我需要的时候分配和使用它,但因为上面是Async并使用块我不能只将JSON返回给{{1谁叫它,必须复制&将上述方法粘贴到我需要的每个ViewController
中。
我的目标是在我的应用中仅在一个地方使用上述内容,并且仍然可以从我的应用周围的不同ViewController
调用它并获取我需要的数据。
我想避免使用像ViewControllers
或NSNotification
这样的观察者,并寻找更优雅的解决方案。
经过一番阅读后,我注意到有可能绕过街区。这可能是上述的解决方案吗?一个代码示例将不胜感激。
答案 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]
。