【问题标题】:Open UIManagedDocument take too much time打开 UIManagedDocument 需要太多时间
【发布时间】:2013-05-19 03:52:31
【问题描述】:

最近,我在 iOS 中使用一个时间表应用程序,但我在使用 Core Data 时遇到了问题。

我的应用程序有一个类似于 Apple 创建的原始日历应用程序的主用户界面,我将所有事件数据保存在 Core Data 数据库中。

我创建了一个 UIManagedDocument,以便使用它的 NSManagedObjectContext 从数据库中获取数据,一切正常。

但是,我需要在运行时使用 NSManagedObjectContext 在几个不同的视图控制器中多次获取数据。每次我这样做时,我都需要重新打开 UIManagedDocument,但打开文档需要太多时间(可能需要 2 秒甚至更长时间,我必须在视图中显示微调器)。

所以这是我的问题:

  1. 打开 managedDocument 的正确方法是什么?(我的意思是在午餐图像时间打开它?)
  2. 有没有办法只打开 managedDocument 一次并在运行时保持打开状态?(所以我可以一直使用它的上下文)
  3. 数据是否存储在我创建的 managedDocument 中?(我发现如果我删除文档,数据就消失了)

谢谢。

【问题讨论】:

    标签: iphone ios objective-c core-data uimanageddocument


    【解决方案1】:

    你会得到很多关于如何做到这一点的不同意见,但基本上你应该只需要打开一次文档。这是由一些对象完成的,该对象完成工作并存储它,以便在不同的视图控制器询问时可以再次返回它。

    许多人为此创建单例或将其放在 App Delegate 中。我已经实现了一个protocol,它让我可以将它放在对特定应用程序方便的地方,而我的其他代码不必知道任何关于返回信息的对象的信息。只要它响应协议,它就可以是 App Delegate、单例类或任何其他对象类型。

    importing AppDelegate

    我在上面示例中放置的协议只是返回有关数据库位置的信息。在我的实际实现中,我有一个带有回调的 openDatabase 方法,让我知道它何时完成以及自动初始化和更新方法。

    您还可以通过在主线程之外执行打开操作来提高性能。这使您的 UI 保持响应,但不会更快地显示数据,您必须小心托管对象上下文及其所在的线程。

    祝你好运……

    【讨论】:

    • 非常感谢您的帮助,而且这种方法似乎有效,我打开文档并将上下文存储为使用协议的全局实例。但是,只有当我的应用程序从后台恢复时才会出现崩溃问题,而且这个问题是随机发生的。控制台显示类似 [UIManagedDocument _setInConflict:] 的错误消息。我应该对 applicationDidEnterBackgroundapplicationWillEnterForeground 中的全局实例或 UIManagedDocument 做些什么吗?任何帮助将不胜感激。
    • 我没有遇到过这种情况,但在后台某些状态可能会因您的数据访问而改变,从而产生冲突(例如另一个应用程序或服务更改数据或连接),这是有道理的)。我遇到冲突的时候是我的应用程序中的多个线程进行了更改。在 applicationDidEnterBackground 中保存并关闭并在 applicationWillEnterForeground 中重新打开可能值得一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2011-09-23
    相关资源
    最近更新 更多