在我滚动之前,数据不会在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