即使一个API失败,也可以加载View Controller

我有三个API从数据中提取数据,并将其放入ViewController.mUITableView

有没有办法让UITableView加载,如果其中一个网站没有加载?

现在, ViewController.m只是不加载,如果所有3个来源不加载我的方法。

这是我使用的方法:

 - (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不加载, API2API3仍然会加载并显示在ViewController.mUITableView中。

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); }]; } 

它仍然可以调用你的旧function或一些外部库的两个块,但它结合成一个单一的块。 这个调用者期望他们将得到一个好的RKMappingResult和一个nil NSError,或者一个nil作为结果参数和一个错误的实例。 有了这个api,我们可以很容易地修复你的方法,只logging错误发生和进行,错误或不…

 - (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]; }]; }]; }]; } 

也许你可以尝试这样的事情,首先定义树布尔variables: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]; } }