Core Data是否始终遵循returnsObjectsasFaults?

时间:2012-10-08 11:09:13

标签: objective-c core-data

在下面的代码中,我将returnObjectsasFaults显式设置为false。然后在请求后RIGHT我检查对象是否有故障。 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;
}

1 个答案:

答案 0 :(得分:7)

我在操作子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上执行获取请求,那么这当然是不会发生的。

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

[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没有直接绑定到存储,而是绑定到父上下文,则不要按预期运行。 我在Apple文档中找不到与此事有关的任何内容,但我仍然认为这不是一个错误。