如果想要对Coredata进行一系列的操作,就必须要先初始化NSManagedObjectContext,那么怎么得到Context呢?有两种方法:
一种是通过UIManagedDocument获得:
这种比较麻烦,代码如下
self.document = [[UIManagedDocument alloc] initWithFileURL:(URL *)url];
if ([[NSFileManager defaultManager] fileExistsAtPath:[url path]]) {
[document openWithCompletionHandler:^(BOOL success) {
if (success) [self documentIsReady];
if (!success) NSLog(@“couldn’t open document at %@”, url);
}];
} else {
[document saveToURL:url forSaveOperation:UIDocumentSaveForCreating
completionHandler:^(BOOL success) {
if (success) [self documentIsReady];
if (!success) NSLog(@“couldn’t create document at %@”, url);
}];
}
- (void)documentIsReady
{
/*对应的状态有:
UIDocumentStateClosed (还没有打开或者创建)
UIDocumentStateSavingError (completion handler保存没有成功)
UIDocumentStateEditingDisabled (重试)
UIDocumentStateInConflict(例如有其他人在使用更新,有冲突到等)*/
if (self.document.documentState == UIDocumentStateNormal) {
//如果成功的话,我们就获得了我们需要的context了,然后操作core data
NSManagedObjectContext *context = self.document.managedObjectContext;
}
}
第二种就是直接初始化了,代码如下
1、self.Context = [[NSManagedObjectContext alloc] init];
2、self.Context = [NSManagedObjectContext new];
3、self.Context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];建议是用第三种。
这里的type有三种:
(1)NSConfinementConcurrencyType
官方文档的解释是:
Specifies that the context will use the thread confinement pattern.
指定context的线程约束类型,使用这种类型的context需要自己新建一个线程和他绑定在一起使用,所以最好在它绑定的线程中执行block,也就是说最好不要使用context自带的performBlock了,需要自己重写,不然很容易导致死锁(该类型在iOS9中被废弃,是为了兼容之前的设计)
(2)NSPrivateQueueConcurrencyType
官方文档的解释是:
Specifies that the context will be associated with a private dispatch queue.
官方文档的解释是:
Specifies that the context will be associated with the main queue.
指定context和主线程关联的类型,该performBlock会放到主线程中去执行