我有AFHTTPClient
的子类
主要思想是我通过我的AFHTTPClient
子类单例调用所有API,并且所有请求都通过1个点进行错误处理和HUD显示。
这是每个API调用的入口点:
-(void) makeRequestWithPath:(NSString*) path andParams:(NSDictionary*) params
success:(void (^)( id JSON, AFHTTPRequestOperation *operation)) success
failure:(void (^)( NSError *error)) failure
我有很多类似的API调用方法:
-(void) getListMainTreeWithSuccess:(void (^)( id JSON, AFHTTPRequestOperation *operation)) success
failure:(void (^)( NSError *error)) failure
{
[self makeRequestWithPath:@"objects/selectlist" andParams:nil success:^(id JSON, AFHTTPRequestOperation *operation) {
success(JSON,operation);
} failure:^(NSError *error) {
failure(error);
}];
}
这对我的需求很好。但是我遇到了一个问题,我需要通过我的AFHTTPClient
子类循环进行串行请求,并在所有这些子类完成时执行一些操作,我找到了方法
-(void)enqueueBatchOfHTTPRequestOperationsWithRequests:(NSArray *)urlRequests
progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock
completionBlock:(void (^)(NSArray *operations))completionBlock
哪个应该解决我的问题,但问题是我通过AFHTTPClient
调用所有方法,它的方法是getPath:和postPath:以前的方式迫使我重写所有内容并使我的子类完全无用,因为我需要添加NSArray
的{{1}},这是不可能从我的子类和我的方法构造或提取。以前我试过用__block来同步信号量和其他东西的请求,但我没得到我需要的东西,请帮助我!
的更新: 的
似乎甚至不可能使用AFHTTPRequestoperation
方法(即使重写我的所有代码),因为此方法需要一组http请求操作,但是不可能用它们构造POST请求。
答案 0 :(得分:0)
我通过增量/减量挂起下载系统解决了这个问题,并将HUD绑定到了它。
[networkStatus beginNetworkActivity];
[client someRESTActionWithCompletion:^(id object, NSError *error) {
[networkStatus endNetworkActivity];
if (error) {
// Handle the error ...
}
if (![networkStatus hasNetworkActivity]) {
// All downloads have finished
}
}];
我将网络状态对象与AFHTTPClient子类分开,但如果这是你想要的,它可以构建到客户端。
网络状态保留内部计数器。 -beginNetworkActivity
递增计数器,如果计数器为0,则显示HUD。 -endNetworkActivity
递减计数器,如果计数器变为0,则它解除HUD。如果计数器大于0,则-hasNetworkActivity
会返回YES
。
其他注释:我将成功和失败的回调组合成single completion callback。我将网络状态逻辑与客户端分开,因为有时我会使用单例网络状态对象,有时候我会使用创建的实例,有时我根本不会使用它。这一切都取决于对更高层次逻辑的需求。
答案 1 :(得分:0)
再次,正如@MikePollard所说,使用
创建AFHTTPRequestOperation
[AFHHTPClient HTTPRequestOperationWithRequest:success:failure:]
对于此方法,使用(或使用另一个,选择适合您的方法)创建NSURLRequest
。您还可以在此处指定使用POST
,GET
或其他任何方法的方法。
[AFHTTPClient requestWithMethod:
path:
parameters:]
之后将所有操作保存到NSArray
,并使用以下方式安排它们:
[AFHTTPClient enqueueBatchOfHTTPRequestOperationsWithRequests:
progressBlock:
completionBlock:]
代码示例:
NSMutableArray *ops = [NSMutableArray new];
NSMutableURLRequest *request1 = [[AFHTTPClient sharedClient] requestWithMethod:@"GET"
path:@"MyEndpoint"
parameters:@{@"key1": @"value"}];
AFHTTPRequestOperation *op1 = [[AFHTTPClient sharedClient] HTTPRequestOperationWithRequest:request1
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success!");
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure!");
}];
[ops addObject:op1];
NSMutableURLRequest *request2 = [[AFHTTPClient sharedClient] requestWithMethod:@"POST"
path:@"MyAnotherEndpoint"
parameters:@{@"key2": @(104)}];
AFHTTPRequestOperation *op2 = [[AFHTTPClient sharedClient] HTTPRequestOperationWithRequest:request2
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success!");
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure!");
}];
[ops addObject:op2];
[[AFHTTPClient sharedClient] enqueueBatchOfHTTPRequestOperationsWithRequests:ops
progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
NSLog(@"numberOfFinishedOperations: %d totalNumberOfOperations %d",
numberOfFinishedOperations,
totalNumberOfOperations);
}
completionBlock:^(NSArray *operations) {
NSLog(@"All operation compelted!");
}];