从异步函数重新加载UITable调用

时间:2014-10-02 18:07:01

标签: asynchronous uiviewcontroller swift

我在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 /表。这是因为它是在异步函数中调用的吗?

1 个答案:

答案 0 :(得分:5)

  

这是因为它是在异步函数中调用的吗?

这可能就是问题所在。在后台线程中调用回调很有可能。 UIKit不是线程安全的,涉及它的所有内容都必须在主线程上运行。确保reloadTopMost()在主线程上运行应该可以解决问题。您可以使用dispatch_async()执行此操作:

// In your callback:
dispatch_async(dispatch_get_main_queue(), {
    self.reloadTopMost()
})

请注意,dispatch_async()会立即返回。如果您需要等到重新加载完成,则可以使用dispatch_sync()