Objective c 更新背景动画中UITableView的数据

Objective c 更新背景动画中UITableView的数据,objective-c,ios,uitableview,Objective C,Ios,Uitableview,我有一个UITableViewController,它应该在后台获取数据,然后刷新UITableView。但是,当我在后台运行update方法时,它会打断整个应用程序中的所有过渡动画(将视图控制器推到导航堆栈时会出现幻灯片)。奇怪的是,完全相同的模型适用于与此非常相似的其他类。 以下是我用于后台更新的呼叫: [self performSelectorInBackground:@selector(updateData) withObject:nil]; 然而,这是可行的,但当然不是在后台完成的:

我有一个UITableViewController,它应该在后台获取数据,然后刷新UITableView。但是,当我在后台运行update方法时,它会打断整个应用程序中的所有过渡动画(将视图控制器推到导航堆栈时会出现幻灯片)。奇怪的是,完全相同的模型适用于与此非常相似的其他类。 以下是我用于后台更新的呼叫:

[self performSelectorInBackground:@selector(updateData) withObject:nil];
然而,这是可行的,但当然不是在后台完成的:

[self updateData];
最后是正在运行的方法:

- (void)updateData{
    updating = YES;
    [progress show:YES];
    dataSource = [[NetworkHandler sharedInstance:self] getRaces];
    [progress hide:YES];
    updating = NO;
    [self.tableView reloadData];
}

更新标志无论如何都不是对信号量的尝试,只是一种确保视图不会被更新两次的方法,以防用户在视图之间来回切换。;)

[self.tableView重载数据]看起来可能会导致某种线程问题。对UI的所有更新都应该在主线程中完成。因此,这应该是可行的:


[self.tableView performselectornmainthread:@selector(reloadData)]

自2015年2月起,上述答案中提到的方法已被弃用,取而代之的是:

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

我会试试的,不过在其他的课程中它确实有效。我确实发现了一个不同点,那就是我有我自己对UITableView的引用,连接在IB中。而在这个类中,我只是使用在UITableViewController中找到的引用。你应该确保所有更新UI的操作都应该在主线程上执行。我要收回我以前的语句,完全相同的代码在另一个类中工作。在主线程上调用该方法的问题是它会锁定应用程序,我想要一个在后台添加项的解决方案。添加到什么,数据源还是表视图?它们正在后台添加到数据源中。如果你的UI仍然迟钝,可能是其他原因造成的。事实证明,我是用一种方法从服务器获取图像的,该方法在重新加载表时调用。修正了这一点,现在它就像一个符咒。奇怪的是,这也解决了最初的问题,因此在后台线程中调用重载数据时代码可以工作。