UITableView重新加载数据两次,但没有正确显示数据

时间:2015-06-25 21:52:24

标签: ios objective-c iphone uitableview

我正在调用两个webservices,我在一个tableview中显示这两个内容。由于我是异步调用,我想先加载先到先得的数据,然后在第二次服务完成时再次调用。这些服务的响应被插入到它们各自的部分中,因此我将它们保存在各自的NSarrays中。

A - >到网络服务 - >每当响应到达时,tableView reloadData

B - >到Web服务 - >每当响应到达时,tableView reloadData

-(void)UpdateTable{

    if (_firstRequest  || _secondRequest){
        runningRefresh = false;
       [self.tableView reloadData];
        [self removeLoading];
    }

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section == 0){
        return 1;
    }
    else if (section == 1){
        if (!_firstRequest){
            return 1;
        }else{
            NSLog(@"SECTION 1");
            if ([self._collectionsNewGame isKindOfClass:[NSNull class]] || [self._collectionsNewGame count] == 0){
                NSLog(@"0 COUNT");
                return 0;
            }
            NSLog(@"%ld COUNT",[self._collectionsNewGame count]);
            return [self._collectionsNewGame count] + 1;
        }

    }
    else if (section == 2){
        if (!_thirdRequest){
            return 1;
        }else{
            if ([self._collectionsRandom isKindOfClass:[NSNull class]] || [self._collectionsRandom count] == 0){
                return 0;
            }
            return [self._collectionsRandom count] + 1;
        }

    }
    else return 0;
     //count number of row from counting array hear cataGorry is An Array
}

我只是在cellrowatindexpath中阅读并显示它。

但是,当我这样做的时候,有些行细胞没有出现并且行为奇怪。知道怎么做到这一点吗?

1 个答案:

答案 0 :(得分:0)

在一个数据源中整合这些服务的响应,如果您想要的只是向NSArray添加行而不是使用UITableView,请说reloadData需要insertRowsAtIndexPaths: withRowAnimation :。确保您拥有正确的验证

Here is the apple reference

最后使用主队列执行UITableview更新

[self performSelectorOnMainThread:@selector(updateTable) 
                   withObject:object 
                waitUntilDone:YES]

通过将YES传递给waitUntilDone,您阻止了该方法已完成的主线程。

以同样的方式使用

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [self updateTable];
}];  

不同之处在于,这种方法并不能保证何时执行updateTable。该队列中可能还有其他项目仍在等待执行。