1

我有子类的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: 和以前的方法迫使我重写所有内容并使我的子类完全无用,因为我需要在那里添加NSArrayof AFHTTPRequestoperation,这不是可以从我的子类和方法中构造或提取。以前我尝试使用 __block 将请求与信号量和其他东西同步,但我没有得到我需要的东西,请帮助我!

更新: 似乎甚至无法使用enqueueBatchOfHTTPRequestOperations方法(即使重写我的所有代码),因为此方法需要 http 请求操作数组,但不可能用它们构造 POST 请求。

4

2 回答 2

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!");
                                                             }];
于 2014-01-10T16:08:07.740 回答
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

其他注意事项:我将成功和失败回调合并为一个完成回调。我将网络状态逻辑与客户端分开,因为有时我会使用单例网络状态对象,有时我会使用创建的实例,有时我根本不会使用。这一切都取决于对更高级别逻辑的需求。

于 2014-01-10T13:22:18.127 回答