我在Swift中实现了一个程序,我使用的是Core Data
框架。我的应用程序已完成,但我决定重构Core Data Stack。现在我Core Data Stack
的结构是这样的:核心数据栈结构
我接过一看Core Data Stack
形式大牧场书呆子和Github上一些其他球员,大部分时间,他们Core Data Stack
看起来是这样的:
我想知道是否有更好的方式来重构我Core Data Stack
以类似的方式。概括地说,这是我在用我的Managed Object Context
为:
mainContext
=所有UI相关的任务firstPrivateContext
=从火力地堡导入所有数据,并在数据推动持久性存储登录secondPrivateContext
=从设备导入联系人到核心数据在登录和注册thirdPrivateContext
=为使用该应用程序
所以这就是我的应用程序大致在做什么。如果有人知道更好的方式,我愿意接受任何建议。
这是我使用的代码,当用户再次上线日志:
func importDataFromFirebase(){
guard let importContext = importContext else {return}
FirebaseStore.rootRef.childByAppendingPath("users/"+FirebaseStore.rootRef.authData.uid+"/forums").observeSingleEventOfType(.Value, withBlock:{
snapshot in
guard let firebaseData = snapshot.value as? NSDictionary else {return}
guard let uids = firebaseData.allKeys as? [String] else {return}
importContext.performBlock{
for uid in uids{
guard let forum = NSEntityDescription.insertNewObjectForEntityForName("Forum", inManagedObjectContext: importContext) as? Forum else {return}
FirebaseStore.rootRef.childByAppendingPath("forums/"+uid+"/posts").queryOrderedByKey().observeSingleEventOfType(.Value, withBlock: {
snapshot in
// Saving the chat's messages
guard let data = snapshot.value as? NSDictionary else {return}
importContext.performBlock{
guard let posts = NSEntityDescription.insertNewObjectForEntityForName("Post", inManagedObjectContext: importContext) as? Post else {return}
do{
try importContext.save()
}catch let error{
// Error
}
}
})
}
}
})
}
此图显示了什么,我想实现:
感谢您的回答。我想要实现的行为是首先从Firebase导入所有数据,并在用户登录时将其推送到持久性存储区。比登录后,我想要显示此数据并在添加到时自动更新UI核心数据或Firebase。我已经实现了最后一部分,但是我正在努力解决第一部分问题,有时候所有的数据都被导入或者只是减半。我的进口根本不健壮。我认为这也与我在用户注销时删除所有Core Data的方式有关。 – C00kieMonsta
你知道为什么只有一半数据被导入了吗?你如何进口? –
从你的代码中,我发现你在'for uid in uids'后面没有调用保存上下文。 我对Firebase并不是很熟悉,但据我了解,FirebaseStore.rootRef.childByAppendingPath(...)会执行异步API调用来获取所需的信息,但只有在获得第二个API调用响应后才能保存。 另外,你确定你应该调用'observeSingleEventOfType'吗?它会返回完整的数据集吗? –