0

我正在寻找一种方法来处理“通用”错误,例如请求超时或连接何时脱机。

基本上,我有 AFHTTPSessionManager 的多个(单例)子类,其中每个子类代表一个处理对不同服务器的请求的客户端。每个客户端都是initWithBaseURL按照 AFNetworking 的作者推荐的覆盖设置的;这是设置请求/响应序列化程序以及通用标头的位置。这是一个示例客户端:

@implementation APIClient

+ (APIClient *)sharedClient {
    static APIClient *sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"baseurl.goes.here"]];
    });
    return sharedClient;
}

- (instancetype)initWithBaseURL:(NSURL *)url
{
    self = [super initWithBaseURL:url];

    if(self) {
        // Setup goes here
        self.requestSerializer = [AFHTTPRequestSerializer serializer];
        self.requestSerializer.timeoutInterval = 20.0f;

        self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"text/html", nil];

        [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;

        [AFNetworkActivityLogger sharedLogger].level = AFLoggerLevelDebug;
        [[AFNetworkActivityLogger sharedLogger] startLogging];
    }

    return self;
}

- (void)startPostRequestWithPath:(NSString *)path parameters:(NSDictionary *)parameters successBlock:(APISuccessBlock)success failureBlock:(APIFailureBlock)failure
{
    [self POST:path parameters:parameters
       success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
           success(responseObject);
       } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
           if(isGenericError) {
               // Do something generic here
           }
           else {
               failure(error);
           }
       }];
}

在我的模型(例如 Post)中,我有一个静态方法,视图控制器可以使用该方法通过将自己的成功/失败块传递给客户端来获取数据。所以它是这样的:

View Controller --> Model --> Client --> Model --> View Controller. 

这是模型的实现

@implementation Post

+ (void)fetchLatestPost:(void (^)(Post *parsedData, NSError *error))completion
{
    [[APIClient sharedClient] startRequestWithPath:kIndexPath
                                            parameters:nil
                                           requestType:RequestTypePost
                                          successBlock:^(id data) {
                                              NSError *parsingError = nil;
                                              Post *post = [[Index alloc] initWithDictionary:data error:&err];
                                              completion(index, nil);
                                          }
                                          failureBlock:^(NSError *error) {
                                              completion(nil, error);
                                          }
     ];
}

当视图控制器尝试获取该 Post 并且请求超时时,我想隐藏屏幕内容并显示刷新按钮;此逻辑在我的 BaseViewController 中实现,以便所有视图控制器都可以重用它。问题是,单击该按钮时如何重新启动 SAME 请求?请注意,视图控制器可以从具有不同方法签名的不同模型发出多个请求。任何帮助将不胜感激,因为我似乎根本无法弄清楚这一点。

我曾经使用委托来处理这个问题,其中 BaseViewController 将实现“通用”委托方法。但是,我一直在尝试切换到块,虽然它确实有其优势,但它不允许我使用我的 BaseViewController,因为它不能“覆盖”视图控制器的故障块。

4

0 回答 0