4

次のコードでは、明示的に 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;
}
4

1 に答える 1

8

子 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];
}];

allCompanies で障害が発生します。もちろん、明確にするために、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 でのフェッチは問題なく機能するようです。しかし、子の NSManagedObjectContext の場合は、ストアに直接結び付けられているのではなく、親コンテキストに結び付けられており、期待どおりに動作しません。Apple ドキュメントでこの問題に関連するものを見つけることができませんでしたが、それでもバグではないと思います。

于 2013-02-10T18:58:56.753 に答える