在从connectionDidFinishLoading获取数据之前出现UITableView

时间:2011-12-21 14:05:41

标签: ios uitableview xcode4.2

我有一种情况,我的表在从webservice获取数据之前加载。

当我调试它时,我可以看到我的NSMutableArray有123个对象,但它没有反映在表中。

这是我的connectionDidFinishLoading方法:

-(void)connectionDidFinishLoading:(NSURLConnection *)conn{
myData = [[NSString alloc] initWithData:xData encoding:NSUTF8StringEncoding];
SBJsonParser *jParser =  [SBJsonParser new];
NSError *error = nil;
NSArray *jsonObjects = [jParser objectWithString:myData error:&error];
NSMutableArray *books = [[NSMutableArray alloc] init];

for(NSDictionary *dict in jsonObjects)
{
    Book *b = [Book new];
    b.bookName =[dict objectForKey:@"name"];
    b.published = [dict objectForKey:@"published"];
    [books addObject:b];

}
self.bookArray = books;
[self.tableView reloadData];
NSLog(@"myData = %@",myData);
}

如果我调试了这个,我将获得jsonObjects并填充我的收藏。但我发现我的桌子还是空的。

只是为了澄清这是我的tableView方法:

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath{
...
Book *b = (Book *)[self.bookArray objectAtIndex:[indexPath row]];
cell.textLabel.text = b.bookName;
....

任何人都可以帮助我解决我所缺少的问题吗?

3 个答案:

答案 0 :(得分:1)

检查调用线程。你不能在除mainThread之外的任何东西上进行UIKit更新。我认为你的connectionDidFinishLoading:在一个单独的线程上调用,这就是问题所在。

尝试

dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
});

答案 1 :(得分:1)

对于没有要显示数据的情况以及有数据要显示的情况,您需要考虑numberOfRowsInSection(和numberOfSections)返回的内容。每次调用reloadData时,tableView都会调用这两个方法来获取有关数据源的最新信息。如果您的数据尚未加载,则这些委托方法应报告适当的值。如果未加载数据,则可以测试nil值或执行类似的测试,然后返回适当的值。加载数据后,委托方法应根据数据源中内容的大小返回值。

如果您向我们展示了这些方法的代码,有人可以评论这是否是您的问题。

答案 2 :(得分:1)

这是因为这样做的方法是,在通过网络服务下载内容之前不要加载表格

为此,不要通过IB设置代表。完成此Web请求后,通过代码设置委托和数据源,然后调用reloadData method.Hence我们可以让表等待加载直到网络连接被处理。提供一些自定义HUD的整洁活动指示器加载,这将完成工作