OStack程序员社区-中国程序员成长平台

标题: ios - 核心数据、并发和 GCD [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 21:20
标题: ios - 核心数据、并发和 GCD

我在尝试弄清楚如何同时正确地使用 Core Data 时遇到了困难。

每次有更新时,我都必须在添加新数据之前清除实体的核心数据。因此我决定使用这个片段:

-(void)addSaleNSArray *)results{

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSString *entity = @"Sale";

    CoreDataManager.sharedInstance.delegate = self;

    dispatch_async(dispatch_get_main_queue(), ^{
        [CoreDataManager.sharedInstance deleteEntityWithName:entity];
    });

    NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    privateContext.parentContext = CoreDataManager.sharedInstance.managedObjectContext;

    for (NSDictionary *dataDictionary in [results valueForKey"Sales"])
    {
        NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:privateContext];


        // Fill ManagedObject
        // .....

    }

    NSError *error;
    [privateContext save:&error];

    if (error != nil) {
        NSLog(@"Couldn't save private context bcoz of %@\n%@", error, error.localizedDescription);
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        // Save Main ManagedObjectContext
        [CoreDataManager.sharedInstance saveContext:CoreDataManager.sharedInstance.managedObjectContext WithEntityName:entity];
    });
});
}

问题是我必须为其他 2 个实体做同样的事情,同时保持 UI 响应,而不会对核心数据产生任何影响。

有没有更好的方法来处理这个问题?



Best Answer-推荐答案


  1. 创建一个与 NSPersistentStoreCoordinator 关联的私有(private)上下文。
  2. 删除私有(private)上下文中的对象。
  3. 保存私有(private)上下文。
  4. 如果正在使用任何这些对象,请告诉主队列上下文重置。

确实没有理由删除主上下文中的对象(您似乎正在使用单例)。

如果您的 UI 没有触及您要删除的任何对象,那么您无需重置与用户界面关联的上下文。

您也可以不进行重置,而是让主队列上下文使用来自私有(private)队列上下文的保存通知,这将获得相同的结果。

关于ios - 核心数据、并发和 GCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38421930/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4