即使一个 API 失败也加载视图控制器

问题描述 投票:0回答:2

我有三个

API
,我从中提取数据,并将其放入我的
UITableView
内的
ViewController.m
中。

如果其中一个网站未加载,是否有办法仍然让

UITableView
加载?

现在,如果未按照我的方法加载所有 3 个源,则

ViewController.m
不会加载。

这是我使用的方法:

- (void)loadOneWithSuccess:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success
                   failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *tNE = [defaults objectForKey:[NSString stringWithFormat:@"tNE%@", bn]];
    NSString *path = [NSString stringWithFormat:@"xx/%@/", tNE];

    [self.eObjectManager getObjectsAtPath:path parameters:nil success:success failure:failure];
}


- (void)loadMedia {
    self.combinedModel = [NSMutableArray array];
    // Here's the #1
    [self loadOneWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        [self.combinedModel addObjectsFromArray:mappingResult.array];

    // Here's the trick.  call API2 here.  Doing so will serialize these two requests
    [self loadTwoWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        [self.combinedModel addObjectsFromArray:mappingResult.array];

    // Here's the trick.  call API3 here.  Doing so will serialize these two requests
    [self loadThreeWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        [self.combinedModel addObjectsFromArray:mappingResult.array];

        [self sortCombinedModel];

        [self.tableView reloadData];

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"No?: %@", error);
    }];

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
            NSLog(@"No?: %@", error);
    }];

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"No?: %@", error);
    }];
}

因此,如果

API1
未加载,
API2
API3
仍会加载并显示在
UITableView
中的
ViewController.m
中。

ios objective-c uitableview
2个回答
2
投票

也许你可以尝试这样的事情,首先定义树布尔变量:finish1,finish2和finish3

- (void)loadMedia {

    self.combinedModel = [NSMutableArray array];

    [self loadOneWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        [self.combinedModel addObjectsFromArray:mappingResult.array];
        finish1 = true;
        [self reloadTableData]

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"No?: %@", error);
        finish1 = true;
        [self reloadTableData]
    }];


    [self loadTwoWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        [self.combinedModel addObjectsFromArray:mappingResult.array];
        finish2 = true;
        [self reloadTableData]

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"No?: %@", error);
        finish2 = true;
        [self reloadTableData]
    }];


    [self loadThreeWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        [self.combinedModel addObjectsFromArray:mappingResult.array];
        finish2 = true;
        [self reloadTableData]

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"No?: %@", error);
        finish3 = true;
        [self reloadTableData]
    }];

}

- (void) reloadTableData {

    if (finish1 && finish2 && finish3) {
        [self sortCombinedModel];
        [self.tableView reloadData];
    } 
}

1
投票

loadOne、loadTwo ...函数有一个缺点,那就是它们需要两个块参数,一个表示成功,一个表示失败。 如果您将它们更改为处理成功或失败的单个块,则在发生错误后继续操作会容易得多。

编辑 通过不直接传递完成和失败块来更改调用 eObjectManager 的方式。 相反,实现这些块并重新排列参数以匹配单块接口...

- (void)betterLoadOneWithCompletion:(void (^)(RKObjectRequestOperation*, RKMappingResult*, NSError *))completion {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *tNE = [defaults objectForKey:[NSString stringWithFormat:@"tNE%@", bn]];
    NSString *path = [NSString stringWithFormat:@"xx/%@/", tNE];

    [self.eObjectManager getObjectsAtPath:path parameters:nil success:^(RKObjectRequestOperation *op, RKMappingResult *map) {
        // success! pass the operation, map result and no error
        completion(op, map, nil);
    } failure:^(RKObjectRequestOperation *op, NSError *error) {
        // fail.  pass the operation, no result and the error
        completion(op, nil, error);
    }];
}

它仍然可以使用两个块调用您的旧函数或某些外部库,但它将结果组合到一个块中。 调用者期望他们要么得到一个好的 RKMappingResult 和一个 nil NSError,要么得到一个 nil 结果参数和一个错误实例。 有了这个 api,我们可以轻松修复您的方法,仅在错误发生时记录错误并继续执行,无论错误与否......

- (void)loadMedia {
    self.combinedModel = [NSMutableArray array];

    // changed the loadOneWithCompletion signature to take just a single block, calling it on success or fail
    [self betterLoadOneWithCompletion:^(RKObjectRequestOperation *op, RKMappingResult *mappingResult, NSError *error) {
        // if it worked, handle the results
        if (!error) {
            [self.combinedModel addObjectsFromArray:mappingResult.array];
        } else {
            // if it didn't work, log the error, but execution continues
            NSLog(@"No?: %@", error);
        }
        // even if it didn't work, we can keep going...
        [self betterLoadOneWithCompletion:^(RKObjectRequestOperation *op, RKMappingResult *mappingResult, NSError *error) {
            // same - handle results
            if (!error) {
                [self.combinedModel addObjectsFromArray:mappingResult.array];
            } else {
                // same - log the error if there is one
                NSLog(@"No?: %@", error);
            }
            // same - log the error and keep going
            [self betterLoadOneWithCompletion:^(RKObjectRequestOperation *op, RKMappingResult *mappingResult, NSError *error) {
                // same...
                if (!error) {
                    [self.combinedModel addObjectsFromArray:mappingResult.array];
                } else {
                    NSLog(@"No?: %@", error);
                }
                [self sortCombinedModel];
                [self.tableView reloadData];
            }];
        }];
    }];
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.