IOS CoreData,使用哪个 NSManagedObjectContextConcurrencyType,为啥?

Posted

技术标签:

【中文标题】IOS CoreData,使用哪个 NSManagedObjectContextConcurrencyType,为啥?【英文标题】:IOS CoreData, which NSManagedObjectContextConcurrencyType to use and why?IOS CoreData,使用哪个 NSManagedObjectContextConcurrencyType,为什么? 【发布时间】:2012-09-13 04:08:43 【问题描述】:

我无法理解 NSManagedObjectContextConcurrencyType 的文档。我会在以下情况下使用哪种类型,为什么?

- (void)viewDidLoad

    self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:???];
    [self loadRecordsFromCoreData];



- (void)loadRecordsFromCoreData 

[self.managedObjectContext performBlockAndWait:^
    //[self.managedObjectContext reset]; //do I need to do this?
    NSError *error = nil;
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Item"];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"display == YES"];
    [request setPredicate:predicate];
    [request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES]]];

    self.items = nil;
    self.items = [self.managedObjectContext executeFetchRequest:request error:&error];

];

[self displayItems];

-displayItems 会根据 self.items 数组中对象的属性显示视图,例如 item.image、item.title、item.descriptionText 等。

【问题讨论】:

你打算在多个线程中使用它吗? 没有。各个视图控制器是否应该有自己的上下文?或者我应该在应用程序委托中只有一个主要上下文?我有 3 个视图控制器,它们可以像这样创建自己的上下文。 问题是它不是线程安全的。如果你打算只从一个线程调用它,你可以使用默认类型(线程限制类型)。每个线程只需要一个。 【参考方案1】:

NSMainQueueConcurrencyType.

UI 事件,例如视图加载,发生在主线程上。您将在主线程(本例中为 self.items)上操作您的对象,因此您应确保将它们提取到上下文中/也保存在该线程中。

NSPrivateQueueConcurrencyType 用于在后台线程上完成工作的上下文。

【讨论】:

以上是关于IOS CoreData,使用哪个 NSManagedObjectContextConcurrencyType,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData - 相当于使用带有示例的类别 - Swift

iOS 7 中的 CoreData 迁移

使用 IBAction 插入数据抛出异常

如何让 SwiftUI 与 Core Data 一起工作(在启动项目后)?

JSON编码和解码核心数据

Coredata或Sqlite哪个更好[关闭]