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