【发布时间】: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