NSError:"Code=134060 Cannot fetch without an NSManagedObjectContext in scope" 解决方法

来源:互联网 发布:大数据商务拓展怎么做 编辑:程序博客网 时间:2024/05/01 03:59

在用一个NSFetchRequest 获取所有实体后,出现上面的错误.
贴出简要代码

/*- viewDidLoad:*/self.fetchTableDataRequest = [NSFetchRequest fetchRequestWithEntityName:@"Event"];    self.fetchTableDataRequest.predicate = [NSPredicate predicateWithValue:YES];    NSSortDescriptor *sortDes = [NSSortDescriptor sortDescriptorWithKey:@"timeStamp" ascending:YES selector:@selector(compare:)];    self.fetchTableDataRequest.sortDescriptors = @[sortDes];    self.fetchTableDataRequest.entity = [NSEntityDescription entityForName:self.fetchTableDataRequest.entityName inManagedObjectContext:self.managedObjectContext];    [self excuteRequest];    [self.tableView reloadData];/*- excuteRequest:*/- (void)excuteRequest {    NSError *error;    [self.managedObjectContext executeRequest:self.fetchTableDataRequest error:&error];    if (error) {        NSLog(error.description);        abort();    }    [self.managedObjectContext performBlockAndWait:^{    }];//    NSError *error;    self.dataSourceArray = [[self.fetchTableDataRequest execute:&error] mutableCopy];    if (error) {        NSLog(error.description);        abort();    }}

注意到我用了两种方法来执行fetchRequest.原因是我看到文档中是这么说的

You use NSFetchRequest objects with the methods executeFetchRequest:error: and countForFetchRequest:error:, defined by NSManagedObjectContext.

并且NSFetchRequest本身有一个excute:方法,文档说这个方法会到和本线程(或者是queue,我没弄清楚)绑定的NSManagedContext获取实体.

后来看了一会文档,文档说要把某些操作上下文的代码放在performBlockAndWait:方法中(或者没有wait).这些操作会自动放到和context相关的线程去执行.因为Context创建时会指定ConcurrenceType.
只要把[self.fetchTableDataRequest execute:&error] 方法放到block里就不会报错了.

没有用[self.managedObjectContext executeRequest:self.fetchTableDataRequest error:&error];是因为这个方法返回的不是一个实体数组,而是一个ResultType,我看了下文档,没发现有其他的获取实体数组的属性方法.只有通过NSFetchRequest本身excute方法才能得到实体数组.

0 0