【问题标题】:Show Activity Indicator on viewWillDisappear在 viewWillDisappear 上显示活动指示器
【发布时间】:2016-06-07 11:47:13
【问题描述】:

viewWillDisappear 上,我需要更新相当多的Core Data 记录,这样做会在我从一个视图控制器移动到另一个视图控制器(通过选项卡视图控制器)时产生延迟。

在我的viewWillDisappear 方法中,我调用settingsChanged(),如下所示:

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    //other things
    if anySettingChanged {
      settingsChanged()
    }
}

func settingsChanged() {
  // attempt to display activity indicator view
  context.performBlockAndWait { // on private queue
    // update a lot of Core Data records
    // attempt to hide activity indicator view
  }
}

但是,尽管该视图在滞后期间可见,但我无法更新该视图消失。我只是想以某种方式显示正在发生的事情,而不是延迟 2-3 秒。但我似乎无法显示活动指示器视图! (我使用主线程来更新视图!)

使用:

context.performBlock 

解决了延迟问题,但会导致错误,因为我的下一个 viewController 依赖于 Core Data 已完成更新。具体来说,我得到了

“由于未捕获的异常'NSGenericException'而终止应用程序, 原因:'*** 集合 <__nscfset:> 在发生突变时 被枚举。'"

【问题讨论】:

  • 如果你想要 viewWillDisappear 上的方法,然后调用 viewWillDisappear 。但在上面你在 func viewDidDisappear 中调用。当视图控制器完全消失时调用 func viewDidDisappear。所以调用 viewWillDisappear。
  • 修正了,这是一个错误,viewWill 在我的代码中。
  • 为了解决崩溃,您可以实现本地通知。当context.performBlockAndWait完成时发布本地通知,只有在通知发布后才对下一个VC进行抓取。
  • @anders32 : 上下文局部变量在您的类中还是在 appdelegate 或其他单例类中?如果在 viewwillDisappear 之后它的局部变量将被设置为 nil,所以你不能使用 performBlock 你将不得不使用 performBlockAndWait 但你可以改善用户体验
  • 它不会因 performBlockAndWait 而崩溃 - 它会滞后。它与 performBlock 一起崩溃。这可能适用于 performBlock,但我更喜欢在 Core Data 完成之前只使用活动视图指示器。

标签: ios swift core-data uiactivityindicatorview


【解决方案1】:

你在这里做什么是覆盖viewWillDisappear方法,所以你太早调用超级引用,试试这个:

override func viewWillDisappear(animated: Bool) {
    //other things
    if anySettingChanged {
      settingsChanged()
    }
    super.viewWillDisappear(animated)
}

【讨论】:

  • 仍然没有改变视图。我正在尝试为我的活动指示器设置动画,直到我离开视图然后返回它才会发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
相关资源
最近更新 更多