【问题标题】:Reload UITable call from asynchronous function从异步函数重新加载 UITable 调用
【发布时间】:2014-10-02 18:07:01
【问题描述】:

我在 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 one 等问题的答案中得到的想法。我确信 if 语句正在为每个 vc 类传递。所以我不确定为什么这不会重新加载 VC/表。这是因为它是在异步函数中调用的吗?

【问题讨论】:

    标签: asynchronous uiviewcontroller swift


    【解决方案1】:

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

    这可能是问题所在。很有可能在后台线程中调用回调。 UIKit 不是线程安全的,所有涉及它的东西都必须在主线程上运行。确保reloadTopMost() 在主线程上运行应该可以解决问题。你可以使用dispatch_async() 来做到这一点:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2019-01-11
      • 2023-03-25
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      相关资源
      最近更新 更多