我正在使用Swift实现一个程序,我使用的是Core Data框架。我的应用程序已经完成,但我已经决定重构核心数据堆栈。现在,我的Core Data Stack的结构如下所示:

我看了一下“大牧场Nerd”上的Core Data Stack和其他一些人,大多数时候,他们的Core Data Stack是这样的:

我想知道是否有更好的方法以类似的方式重构我的Core Data Stack。简而言之,这就是我使用Managed Object Context的目的:
mainContext =所有与UI相关的任务firstPrivateContext =用于从Firebase导入所有数据并将数据推送到Login的持久存储区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
}
}
})
}
}
})
}这张图表显示了我正在努力实现的目标:

发布于 2016-09-14 17:42:41
您可以以任何方式构建您的CoreData堆栈,但首先回答以下问题--您想要实现的行为。如果您希望在导入某些内容时自动更新UI,则您的解决方案将无法工作。
在private managed object context之后使用persistent store coordinator的全部目的是在后台队列中保持大量操作(保存到文件)。
如果您希望在导入更新后立即在屏幕上看到更新,则应该在child private managed object context中进行导入,后者的parentContext设置为main managed object context。对于更新UI,您可以使用NSFetchedResultsController。这样,每当您在child managed object context中保存时,它将触发通知,通知将由NSFetchedResultsController和update UI处理。
不要忘记保存整个堆栈。调用child managed object context将其保存到文件中是不够的。
建议编写一些保存完整堆栈的方法,例如:
- (void)saveWithCompletionBlock:(void (^)(NSError *error))completionBlock {
static dispatch_queue_t queue = NULL;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
queue = dispatch_queue_create("CoreDataSaveQueue", 0);
});
//Retain current NSManagedObjectContext to avoid unloading
__block NSManagedObjectContext *strongSelf = self;
dispatch_async(queue, ^{
__block NSManagedObjectContext *context = strongSelf;
__block NSError *error = nil;
do {
[context performBlockAndWait:^{
if (context != nil && [context hasChanges])
[context save:&error];
context = (nil != error ? nil : context.parentContext);
}];
} while (nil != context);
dispatch_async(dispatch_get_main_queue(), ^{
if (completionBlock)
completionBlock(error);
});
//Release current NSManagedObjectContext after save completed
strongSelf = nil;
});
}我希望我的解释将帮助您理解如何构建堆栈。
https://stackoverflow.com/questions/39494855
复制相似问题