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