CoreData的NSManagedObjectContext创建

如果想要对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.

指定context和一个全局私有的线程队列关联的类型,使用这种类型的context不需要自己新建线程,因为他已经和一个全局的私有线程队列关联了,所以当你执行performBlock时,他会将block放到其私有线程队列去执行。
(3)NSMainQueueConcurrencyType

官方文档的解释是:

Specifies that the context will be associated with the main queue.

指定context和主线程关联的类型,该performBlock会放到主线程中去执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值