我在http请求中的回调函数中调用这段代码。 http请求是用于更新应用程序数据的get。因此,对于一些VC我需要重新加载视图实例,回调完成后更新Core Data中的所有内容。
这是我目前正在使用的代码块(在回调函数中调用)。
func reloadTopMost(){
var topMost = topMostContoller() as UIViewController
if topMost.isKindOfClass(SecondViewController){
topMost.reloadInputViews()
var svc = topMost as SecondViewController
svc.studentTable.reloadData()
svc.studentTable.setNeedsDisplay()
svc.viewDidLoad()
svc.reloadInputViews()
}else if topMost.isKindOfClass(ThirdViewController){
topMost.reloadInputViews()
var tvc = topMost as ThirdViewController
tvc.inClassTable.reloadData()
tvc.inClassTable.setNeedsDisplay()
tvc.viewDidLoad()
tvc.reloadInputViews()
}
}
如您所见,我尝试过reloadData(),setNeedsDisplay(),viewDidLoad和reloadInputViews()。我从this之类的问题的答案中得到的想法。我确信if语句是为每个vc类传递的。所以我不确定为什么这不会重新加载VC /表。这是因为它是在异步函数中调用的吗?
答案 0 :(得分:5)
这是因为它是在异步函数中调用的吗?
这可能就是问题所在。在后台线程中调用回调很有可能。 UIKit不是线程安全的,涉及它的所有内容都必须在主线程上运行。确保reloadTopMost()
在主线程上运行应该可以解决问题。您可以使用dispatch_async()
执行此操作:
// In your callback:
dispatch_async(dispatch_get_main_queue(), {
self.reloadTopMost()
})
请注意,dispatch_async()
会立即返回。如果您需要等到重新加载完成,则可以使用dispatch_sync()
。