首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >核心数据栈结构

核心数据栈结构
EN

Stack Overflow用户
提问于 2016-09-14 15:54:53
回答 1查看 440关注 0票数 1

我正在使用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 =用于在应用程序使用期间监听来自防火墙的传入数据。

这就是我的应用程序正在做的事情。如果有人知道更好的方法,我愿意接受任何建议。

这是我在用户再次登录时使用的代码:

代码语言:javascript
复制
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
                                        }
                }
            })
        }
    }
})
}

这张图表显示了我正在努力实现的目标:

EN

回答 1

Stack Overflow用户

发布于 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将其保存到文件中是不够的。

建议编写一些保存完整堆栈的方法,例如:

代码语言:javascript
复制
- (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;
    });
}

我希望我的解释将帮助您理解如何构建堆栈。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39494855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档