1

主なアイデアは、サブクラスAFHTTPClient のシングルトンを介してすべての API を呼び出しAFHTTPClient、すべての要求がエラー処理と HUD 表示のために 1 つのポイントを通過することです。これは、すべての 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

これは私の問題を解決するはずですが、問題は、すべてのメソッドを呼び出してAFHTTPClientgetPath: と postPath: のメソッドを呼び出すことです。以前の方法では、すべてを書き直す必要があり、サブクラスを完全に役に立たNSArrayなくAFHTTPRequestoperationします。サブクラスとメソッドから構築または抽出できます。以前、 __block を使用してリクエストをセマフォなどと同期しようとしましたが、必要なものを取得できませんでした。助けてください!

更新:enqueueBatchOfHTTPRequestOperationsこのメソッドは http 要求操作の配列を必要とするため、(すべてのコードを書き直しても) メソッド を使用することさえできないようですが

4

2 に答える 2

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

その他のメモ: 成功と失敗のコールバックを 1つの完了コールバックに結合します。シングルトン ネットワーク ステータス オブジェクトを使用する場合もあれば、作成されたインスタンスを使用する場合もあれば、インスタンスをまったく使用しない場合もあるからです。それはすべて、より高いレベルのロジックへのニーズに依存します。

于 2014-01-10T13:22:18.127 に答える
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!");
                                                             }];
于 2014-01-10T16:08:07.740 に答える