Objective c CoreData是否始终尊重returnObjectsasFaults?

Objective c CoreData是否始终尊重returnObjectsasFaults?,objective-c,core-data,Objective C,Core Data,在下面的代码中,我显式地将returnObjectsasFaults设置为false。然后在请求之后,我立即检查对象是否有故障。NSAssert失败 可能是因为对象是一个imageBlob。也许我错过了什么?我只是想确定一下 这是个小问题。如果我去掉nsassert,那么我的程序无论如何都会运行。还是很糟糕 +(NSFetchRequest * )fetchRequestInContext:(NSString*) entityName:(NSPredicate *) predicate:(NSS

在下面的代码中,我显式地将returnObjectsasFaults设置为false。然后在请求之后,我立即检查对象是否有故障。NSAssert失败

可能是因为对象是一个imageBlob。也许我错过了什么?我只是想确定一下

这是个小问题。如果我去掉nsassert,那么我的程序无论如何都会运行。还是很糟糕

+(NSFetchRequest * )fetchRequestInContext:(NSString*) entityName:(NSPredicate *) predicate:(NSString*) sortKey:(BOOL) sortAscending
{
    //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:[BGMDCRManagedObjectContextThreadHandler managedObjectContext]];
    [request setEntity:entity];

    if(predicate != nil)
    {
        [request setPredicate:predicate];
    }

    if(sortKey != nil)
    {
        NSMutableArray * sortDescriptorArray =[self getMoreSearchDescriptorsForEntity:entityName];
        [request setSortDescriptors:sortDescriptorArray];
    }

    //request.fetchLimit = 200; //can be overridden somewhere else
    request.returnsObjectsAsFaults = false;
    if (entityName == BusinessString)
    {
        request.relationshipKeyPathsForPrefetching = arrayRelationship;
    }

    //[request setIncludesSubentities:<#(BOOL)#>
    return request;
}

+(NSArray *) searchObjectsInContextEntityName:(NSString*) entityName Predicate:(NSPredicate *) predicate SortKEy:(NSString*) sortKey Booelan:(BOOL) sortAscending 
{
    NSManagedObjectContext * moc =[BGMDCRManagedObjectContextThreadHandler managedObjectContext];
    NSFetchRequest *request = [self fetchRequestInContext:entityName:predicate:sortKey:sortAscending];

    NSError *error;

    if (entityName==BusinessString)
    {
        error=nil; //Some code for breakpoint
    }

    NSArray *fetchedObjects = [moc executeFetchRequest:request error:&error];

    for (NSManagedObject * mo in fetchedObjects) {
        NSAssert(!mo.isFault, @"For some reason mo is fault");
    }

    return fetchedObjects;
}
+(NSFetchRequest*)fetchRequestInContext:(NSString*)entityName:(nspreditate*)谓词:(NSString*)sortKey:(BOOL)sortAscending
{
//NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSFetchRequest*request=[[NSFetchRequest alloc]init];
NSEntityDescription*实体=[NSEntityDescription entityForName:entityName inManagedObjectContext:[BGMDCRManagedObjectContextThreadHandler managedObjectContext]];
[请求集合实体:实体];
if(谓词!=nil)
{
[请求集谓词:谓词];
}
如果(排序键!=nil)
{
NSMutableArray*sortDescriptorArray=[self-getMoreSearchDescriptorsForEntity:entityName];
[请求集合集合描述符:sortDescriptorArray];
}
//request.fetchLimit=200;//可以在其他地方重写
request.returnsObjectsAsFaults=false;
if(entityName==BusinessString)
{
request.relationshipKeyPathsForPreference=arrayRelationship;
}
//[请求集包括子实体:
返回请求;
}
+(NSArray*)searchObjectsInContextEntityName:(NSString*)entityName谓词:(NSPreditate*)谓词SortKEy:(NSString*)SortKEy Booelan:(BOOL)排序设置
{
NSManagedObjectContext*moc=[BGMDCRManagedObjectContextThreadHandler managedObjectContext];
NSFetchRequest*request=[self-fetchRequestInContext:entityName:predicate:sortKey:sortAscending];
n错误*错误;
if(entityName==BusinessString)
{
error=nil;//断点的一些代码
}
NSArray*FetchedObject=[moc executeFetchRequest:请求错误:&错误];
用于(获取对象中的NSManagedObject*mo){
NSAssert(!mo.isFault,@“出于某种原因,mo是错误的”);
}
返回获取的对象;
}

我在子NSManagedObjectContext上操作时遇到了相同的问题。我创建了一个如下的问题

NSManagedObjectContext *workerMOC = nil;
workerMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
workerMOC.parentContext = self.moc; // this is my main NSManagedObjectContext
在那之后,如果我这样做:

[workerMOC performBlock:^{
  NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Company"];
  [fetchRequest setReturnsObjectsAsFaults:NO];
  NSArray *allCompanies = [workerMOC executeFetchRequest:fetchRequest error:nil];
}];
我在所有公司中都会遇到错误。当然,为了澄清这一点,如果我在self.moc上执行fetch请求,就不会发生这种情况

但是,如果使用以下方法,我会得到适当的预取结果:

[workerMOC performBlock:^{
  NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
  fetchRequest.entity = [NSEntityDescription entityForName:@"Company" inManagedObjectContext:workerMOC];
  [fetchRequest setReturnsObjectsAsFaults:NO];
  NSArray *allCompanies = [workerMOC.persistentStoreCoordinator executeRequest:fetchRequest
                                                                   withContext:workerMOC
                                                                         error:nil];
}];
因此,在直接绑定到NSPersistentStoreCoordinator的NSManagedObjectContexts上进行抓取似乎是可行的。但在子NSManagedObjectContexts的情况下,这些子NSManagedObjectContexts没有直接绑定到存储,而是绑定到父上下文,它们的行为不符合预期。
我在苹果的文档中找不到任何与此相关的内容,但我仍然认为这不是一个bug。

无论如何,我会对此进行调查,这对我来说似乎是一个bug。我还观察到,
relationshipKeyPaths中设置的prefetching
类型的上下文实际上不会预取
NSPrivateQueueConcurrencyType中的关系