0

2 番目の要求は最初の要求の応答に依存しているため、別の要求内に HTTP 要求があります。これは、複数のView Controller内で使用される単一のメソッドに含まれます。

リクエストを別のリクエスト内に非同期的にラップする最良の方法は何ですか? 2 番目のリクエストの応答に基づいて、iOS アプリの UI を更新したいと考えています。同時に、各View Controller内に「リクエストコード」を入れたくありません。それは、独自の別のクラスにしたいからです。UI ビュー コントローラ コードとリクエスト コードを切り離す最善の方法は何ですか?

ありがとう

4

1 に答える 1

0

私はAFNetworkingを使用しています。

通常は AFHTTPClient をサブクラス化しますが、ここに簡単な例を示します

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];
[client setDefaultHeader:@"Accept" value:@"application/json"];

[client getPath:@"api1" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    [client getPath:@"api2" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        // Yay! success!!
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        // ERROR in API 2
    }];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // ERROR in API 1
}];

セットアップを簡素化する AFHTTPClient のサブクラスの例。

@interface MyHTTPClient : AFHTTPClient
@end

@implementation MyHTTPClient
- (id)initWithBaseURL:(NSURL *)baseURL
{
    self = [super initWithBaseURL:baseURL];
    if (self) {
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [self setDefaultHeader:@"Accept" value:@"application/json"];
    }
    return self;
}
@end

ビュー コントローラーで、操作クラスと Accept ヘッダーの設定をスキップします。

MyHTTPClient *client = [[MyHTTPClient alloc] initWithBaseURL:baseURL];

[client getPath:@"api1" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    [client getPath:@"api2" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        // Yay! success!!
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        // ERROR in API 2
    }];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // ERROR in API 1
}];

セットアップを簡素化し、カスタム クライアント API を作成する例を次に示します。

typedef void (^MySuccess)(id JSON);
typedef void (^MyFailure)(NSError *error);

@interface MyJSONClient : AFHTTPClient
- (void)getJSONSuccess:(MySuccess)success failure:(MyFailure)failure;
@end

@implementation MyJSONClient
- (void)getJSONSuccess:(MySuccess)success failure:(MyFailure)failure
{
    [self getPath:@"api1" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        [self getPath:@"api2" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            success(responseObject);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            failure(error);
        }];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            failure(error);
    }];
}
- (id)initWithBaseURL:(NSURL *)baseURL
{
    self = [super initWithBaseURL:baseURL];
    if (self) {
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [self setDefaultHeader:@"Accept" value:@"application/json"];
    }
    return self;
}
@end

ビュー コントローラーで、カスタム メソッドを使用します。

MyJSONClient *client = [[MyJSONClient alloc] initWithBaseURL:baseURL];

[client getJSONSuccess:^(id JSON) {
    // Yay! success!!
} failure:^(NSError *error) {
    // ERROR in API
}];
于 2013-05-11T21:33:55.093 に答える