Iphone UITableView重新加载数据不';不要立即重新装填
我正在尝试在iPhone应用程序中处理在线数据。但是我因为这个而生气: 我有用于使用NSURLConnection下载数据的对象。方法使用单独线程中的连接(和其他内容)开始工作-Iphone UITableView重新加载数据不';不要立即重新装填,iphone,cocoa-touch,Iphone,Cocoa Touch,我正在尝试在iPhone应用程序中处理在线数据。但是我因为这个而生气: 我有用于使用NSURLConnection下载数据的对象。方法使用单独线程中的连接(和其他内容)开始工作-[NSThread detachNewThreadSelector:@selector(docConnectionInNewThread)to target:self with object:nil] 当数据被加载(connectionDidFinishLoading)时,我将它们交给我的viewController。这
[NSThread detachNewThreadSelector:@selector(docConnectionInNewThread)to target:self with object:nil]代码>
当数据被加载(connectionDidFinishLoading)时,我将它们交给我的viewController。这一切都很好。当我使用断点或NSLog时,我已经准备好在UITableView中显示数据。当我调用reloadData时,不会立即发生任何事情。它可能会在2秒钟后重新加载数据(-(UITableViewCell*)tableView:(UITableView*)tableView cellforrowatinexpath:(nsindepath*)indepath
在此延迟后被调用)
但当我滑动tableView时,它会立即重新加载数据。因此,连接等工作正常,但它只是不重新加载数据。为什么?我想这可能是因为URLConnection阻塞了主线程。但是现在我在单独的线程中使用它,它仍然是一样的…您是否在分离的线程中访问表视图
确保使用以下命令更新主线程上的UI:
-performSelectorOnMainThread:withObject:waitUntilDone:您的tableView.reloadData
函数可能不会在主线程中运行,因此您应该在DispatchQueue.main.async
中使用tableView.reloadData()
在主线程中运行该函数
例如:
DispatchQueue.main.async {
tableview.reloadData()
}
嗯,现在我正常地用连接的东西运行我的对象函数(没有分离的线程),但是当我得到所有需要的数据时,我调用“-performSelectorOnMainThread:withObject:waitUntilDone:”来通知我的viewController重新加载数据,它工作得很好。非常感谢。诀窍是什么?这个名字的意思是“在主线程上毫无耐心地做这件事”。所以它会停止上一个URLConnection或者什么?通常不支持在非主线程上访问UI状态机。特别是,重载数据将表视图标记为需要显示以重载数据(即重载数据是惰性的)。由于您不在主线程上,显示计划可能不正确。您也不能在显示后台线程中的数据时使用相同的集合(可变数组或字典),至少不能在没有适当锁定的情况下使用。在另一个线程上读取NSMutableArray或NSMutableDictionary时,不能从一个线程向其添加对象。