在我滚动之前,数据不会在UITableView中加载

我正在尝试加载单元格中的分析数据,但问题是,它正在同步发生,UitableView不会显示,直到数据完成加载。 我试图通过使用performSelectorInBackground来解决这个问题,但是现在数据并没有加载到单元格中,直到我开始滚动。 这是我的代码:

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self performSelectorInBackground:@selector(fethchData) withObject:nil]; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. self.listData = nil; self.plot=nil; } -(void) fethchData { NSError *error = nil; NSURL *url=[[NSURL alloc] initWithString:@"http://www.website.com/"]; NSString *strin=[[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; HTMLParser *parser = [[HTMLParser alloc] initWithString:strin error:&error]; if (error) { NSLog(@"Error: %@", error); return; } listData =[[NSMutableArray alloc] init]; plot=[[NSMutableArray alloc] init]; HTMLNode *bodyNode = [parser body]; NSArray *contentNodes = [bodyNode findChildTags:@"p"]; for (HTMLNode *inputNode in contentNodes) { [plot addObject:[[inputNode allContents] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; } NSArray *divNodes = [bodyNode findChildTags:@"h2"]; for (HTMLNode *inputNode in divNodes) { [listData addObject:[[inputNode allContents] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; //here you check for PreCreated cell. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } //Fill the cells... cell.textLabel.text = [listData objectAtIndex:indexPath.row]; cell.textLabel.font = [UIFont boldSystemFontOfSize:14]; cell.textLabel.numberOfLines=6; cell.textLabel.textColor=[UIColor colorWithHue:0.7 saturation:1 brightness:0.4 alpha:1]; cell.detailTextLabel.text=[plot objectAtIndex:indexPath.row]; cell.detailTextLabel.font=[UIFont systemFontOfSize:11]; cell.detailTextLabel.numberOfLines=6; return cell; } 

数据加载成功后将其放在某处:

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

这解决了在不在主线程中时调用GUI更新的问题

此代码使用Apple的GCD技术强制重载数据function在主线程上运行。 阅读更多关于并发编程指南以获得更多的理解(这是相当大的领域,所以很难在评论中解释)无论如何,如果你不太了解它,这不是很好的build议,因为它会导致程序崩溃一些罕见的情况。

对于迅捷3:

 DispatchQueue.main.async(execute: { () -> Void in self.tableView.reloadData() }) 

对于迅捷2:

 dispatch_async(dispatch_get_main_queue(), { () -> Void in self.tableView.reloadData() }) 

所有你真正需要做的是任何时候你有一个更新你的后端数据,电话

 [tableView reloadData]; 

既然这是同步发生的,你应该可能有一个像

 -(void) updateTable { [tableView reloadData]; } 

并在您的下载电话中添加数据后

 [self performSelectorOnMainThread:@selector(updateTable) withObject:nil waitUntilDone:NO]; 

你可以使用[cell setNeedsDisplay]; 例如:

 dispatch_async(dispatch_get_main_queue(), ^{ [cell setNeedsDisplay]; [cell.contentView addSubview:yourView]; }); 

我遇到了完全相同的问题! 我希望UITableView在视图控制器出现之前完全填充。 Envil的post给了我所需要的信息,但是我的解决scheme却变得不一样了。

这是我所做的(改造以适应问题提问者的上下文)。

 - (void)viewDidLoad { [super viewDidLoad]; [self performSelectorInBackground:@selector(fethchData) withObject:nil]; } - (void)viewWillAppear { [tableView reloadData]; } 

我有这个问题,我整天都在处理这个问题。

我正在使用静态单元格和reloadData导致加载错误,它只显示可见的单元格,并删除其他人。 我注意到的是,当我向下滚动(y为负值)正确加载的单元格时,所以我编写了这个代码并且工作,尽pipe我不喜欢这样做。

如果您find更好的解决scheme,请拍摄。

 -(void)reloadTableView{ CGPoint point = self.tableSettings.tableView.contentOffset; [self.tableSettings.tableView reloadData]; [UIView animateWithDuration:.001f animations:^{ [self.tableSettings.tableView setContentOffset:CGPointMake(point.x, -10)]; } completion:^(BOOL finished) { [UIView animateWithDuration:.001f animations:^{ [self.tableSettings.tableView setContentOffset:point]; } completion:^(BOOL finished) { }]; }]; } 

首先,这个半解决了我的相关问题。 我想在表格单元格中的图像四angular。 asynchronous调度解决了一些问题,但不是所有的图像。 有任何想法吗?

其次,我认为你应该避免使用闭包捕获列表来创build一个强大的引用循环:

 DispatchQueue.main.async(execute: { [weak weakSelf = self] () -> Void in weakSelf!.tableView.reloadData() }) 

请参阅: https : //developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-ID52