ios - 后台播种/加载 iOS 核心数据存储

标签 ios multithreading swift core-data

我的 iOS 8.0 + 应用程序本质上是一个字典应用程序,以索引、易于导航的格式向用户呈现只读数据集。我已经探索了几种加载静态数据的策略,并且我决定将几个 JSON 数据文件发送到应用程序中,这些文件被序列化并加载到 Core Data 存储中一次该应用程序首先打开。因此,对 managedObjectContext.save() 的调用只会在应用程序的生命周期中发生一次,即首次使用时。

来自阅读 Apple 的 Core Data Programming GuideMac Developer Library(2015 年 9 月更新)中,我了解到 Apple 推荐的做法是

1) 分离 Core AppDelegate 中的数据 堆栈到 dedicated DataController object 中(这让人觉得奇怪,即使在 Xcode 7.2 中,Core Data 堆栈仍然默认放在 AppDelegate 中,但无论如何...... );和
2) 在 background thread 中打开(并且,我假设,种子/加载)持久存储使用 dispatch_async block ,像这样:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
    //(get URL to persistent store here)

    do {
        try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil)

        //presumably load the store from serialized JSON files here?
    } catch { fatalError("Error migrating store: \(error)") }
}

我刚刚开始学习并发和 GCD,所以我的问题很基本:

1) 如果数据集在后台线程中加载,这可能需要一些非平凡的时间才能完成,初始 view controller 如何知道数据加载完成的时间,以便它可以从 ManagedObjectContext 中获取数据以显示在 UITableView 中?

2) 沿着类似的路线,如果我想通过运行一些提取并将调试文本打印到控制台来测试完全加载的数据集,我如何知道后台进程何时完成并且可以安全地开始查询?

谢谢!

p.s. 我正在使用 swift 进行开发,因此任何特定于 swift 的提示都将是巨大的。

最佳答案

与其尝试让您的应用在首次启动时导入只读数据(强制用户在导入数据时等待),您可以 import the data yourself ,然后将只读 .sqlite 文件和数据模型添加到您的应用程序目标,以复制到应用程序包。

对于导入,指定持久存储应使用回滚日志选项,因为不建议对只读存储使用预写日志记录:

let importStoreOptions: [NSObject: AnyObject] = [
    NSSQLitePragmasOption: ["journal_mode": "DELETE"],]

在实际应用中,还要指定捆绑的持久化存储应该使用只读选项:

let readOnlyStoreOptions: [NSObject: AnyObject] = [
    NSReadOnlyPersistentStoreOption: true,
    NSSQLitePragmasOption: ["journal_mode": "DELETE"],]

由于捆绑的持久存储是只读的,因此可以直接从应用程序包访问它,甚至不需要将其从包复制到用户目录。

关于ios - 后台播种/加载 iOS 核心数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34566501/

相关文章:

iphone - iOS 如何检查当前是否正在通话

c++ - 如何使生成的线程停止足够长的时间以使生成线程执行某些操作?

java - 单个 JFrame 中的多线程

swift - 为什么 addTarget 不在扩展中调用我的目标的操作

ios - 令人难以置信的是,容器 View View 不遵守 Storyboard View 顺序,修复了吗?

ios - 在同一个 Xcode 项目中拥有 iOS 和 macOS 应用程序

swift - 在 SwiftUI 中将数据从一个 ViewModel 传递到另一个 ViewModel?

ios - 使 UIView 类符合 UILayoutSupport 协议(protocol)

ios - 用于存储相关常量的全局变量/单例替代方案

c++ - memory_order_seq_cst 如何与非原子操作同步?