我在尝试弄清楚如何同时正确地使用 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 响应,而不会对核心数据产生任何影响。
有没有更好的方法来处理这个问题?
NSPersistentStoreCoordinator
关联的私有(private)上下文。确实没有理由删除主上下文中的对象(您似乎正在使用单例)。
如果您的 UI 没有触及您要删除的任何对象,那么您无需重置与用户界面关联的上下文。
您也可以不进行重置,而是让主队列上下文使用来自私有(private)队列上下文的保存通知,这将获得相同的结果。
关于ios - 核心数据、并发和 GCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38421930/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |