[英]Having to call fetch twice from CoreData
在模拟器和我的真实设备上,在应用终止时都会保存一串字符串。 当我重新启动应用程序并为我的持久数据fetchRequest(通过viewDidLoad或手动按钮操作)时,第一次尝试时得到一个空数组。 直到我第二次fetchRequest才终于得到我的数据。
有趣的是,这个问题似乎没有时间上的差异。 在尝试第二次获取之前,我尝试设置各种超时。 我等待10秒到一分钟,甚至是在第一次获取之后立即都没关系; 仅在第二次尝试时才获取数据。
我必须使用以下代码来获取数据:
var results = try self.context.fetch(fetchRequest) as! [NSManagedObject]
while (results.isEmpty) {
results = try self.context.fetch(fetchRequest) as! [NSManagedObject]
}
return results
为了我的理智,这是一个清单:
private static let context: NSManagedObjectContext = DataController().managedObjectContext
顶部的静态变量private static let context: NSManagedObjectContext = DataController().managedObjectContext
注意**我忘了提到我正在构建一个框架。 我将CoreData与框架的包标识符一起使用,并使用框架中包含的模型,因此我想避免不得不在框架外部使用逻辑(除了在appDelegate中初始化框架)。
应该在位于appDelegate.swift中的applicationDidFinishLaunchingWithOptions中初始化Core Data堆栈,因为在尝试获取数据后会添加psc。
苹果公司提供的样板代码包括:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
/* ... */
do {
try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil)
} catch {
fatalError("Error migrating store: \(error)")
}
}
在addPersistentStoreWithType
调用完成之前,保存的数据不可用,并且异步地在另一个队列上进行。 它会在某个时候完成,但是上面的代码正在执行。 您所看到的并不奇怪-您基本上在循环直到异步调用完成。
您需要以某种方式延迟获取,直到永久性存储已加载。 有两种可能:
persistentStores
属性,以查看是否已加载任何存储,而不是反复尝试获取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.