多个AFHTTPClient请求

时间:2014-01-10 11:22:19

标签: ios objective-c afnetworking afhttpclient

我有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请求。

2 个答案:

答案 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。您还可以在此处指定使用POSTGET或其他任何方法的方法。

[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!");
                                                             }];