0

我在另一个请求中有一个 HTTP 请求,因为第二个请求依赖于第一个请求的响应。这将包含在将在多个视图控制器中使用的单个方法中。

在另一个请求中异步包装一个请求的最佳方法是什么?我想根据第二个请求的响应更新 iOS 应用程序的 UI。同时,我不希望每个视图控制器内部都有“请求代码”,因为我希望它是它自己的另一个类。解耦 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 回答