从多个api异步加载数据

时间:2015-09-11 13:27:05

标签: ios objective-c asynchronous

从一个api请求加载数据并将其存储在一个数组中(假设n对象进入响应json对象), 另一个api请求从第一个api请求获取参数并加载n个对象的状态。

1)第一个api请求将加载n个对象并将其显示在表中:

dispatch_queue_t loadDataQueue = dispatch_queue_create("loadDataQueue",NULL);
dispatch_async(loadDataQueue, ^{      
    // Perform long running process
    [self loadData];
    dispatch_async(dispatch_get_main_queue(), ^{
        // Update the UI
        [tableView reloadData];
        [self hideActivityView];
    });
});

2)现在我正在调用loadstatus方法,它从objectatindex获取参数并加载objectatindex的状态数据。所以这个方法在cellForRowAtIndexPath方法中调用了n次。

dispatch_queue_t loadStatusQueue = dispatch_queue_create("loadStatusQueue",NULL);
dispatch_async(loadStatusQueue, ^{     
    // Perform long running process
    [self loadStatus];
    dispatch_async(dispatch_get_main_queue(), ^
        // Update the UI
        [tableView reloadData];
    });
});

一次更新一行。所以重新加载表n次。 加载所有对象的状态需要时间。 有些时候出现问题。

有人可以为此或其他方式提供有效的解决方案吗?

1 个答案:

答案 0 :(得分:0)

您的问题中的信息有点不清楚(特别是关于objectAtIndex ...这是否意味着在cellForRowAtIndexPath中您获取了单元格的信息,然后基于您发送另一个异步请求来获取它的状态?)

可能还不足以说明所有原因可能会使您的应用变慢,但我可以说重新加载整个表只是为了更新一个单元格并不是一个好主意。此外,我认为您应该先致电loadData获取基本信息的完整数据列表,然后为“可见”单元格调用loadStatus

我想你知道如何将加载的数据/状态存储在数组中以防止重新获取数据。因此,下面的示例可能是您可以采用的,以提高性能:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath   
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"ReusableCell" forIndexPath:indexPath];

    [cell configureData:self.loadedData[indexPath.row]];

    if (self.loadedStatus[indexPath.row]) {
        // If the status has been loaded then
        [cell configureStatus:self.loadedStatus[indexPath.row]];
    } else {
        dispatch_queue_t loadStatusQueue = dispatch_queue_create("loadStatusQueue",NULL);

        __weak __typeof(self) weakSelf = self;
        dispatch_async(loadStatusQueue, ^{
            __strong __typeof(weakSelf) strongSelf = weakSelf;
            if (!strongSelf) {
                return;
            }

            // Perform your long running process here
            // Eg: [strongSelf loadStatusForIndex:indexPath.row];

            UITableViewCell *blockCell = (UITableViewCell *)[strongSelf.tableView cellForRowAtIndexPath:indexPath];

            dispatch_async(dispatch_get_main_queue(), ^{
                [strongSelf.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
            });
        }
                       });
        ....
    }

    return cell;
}