0

UIDocumentを使用してコアデータにアクセスし、メインUIをブロックしないようにバックグラウンドスレッドでNSFe​​tchedResultsControllerをセットアップしようとしています。uidocumentのmanagedobjectcontextを使用しているが、子は使用していない場合は機能します。私はスタックオーバーフローでここにある答えの1つからこのコードのいくつかを取りましたが、fetchedresultscontrollerでそれを動作させることができません。

[ZH peopleDocumentusingBlock:^(UIManagedDocument *peopleDoc){
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        context.parentContext = peopleDoc.managedObjectContext;
        [context performBlock:^{
             NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
           request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES]];
            [NSFetchedResultsController deleteCacheWithName:nil];
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"imageurl.length>0"];
            request.predicate = predicate;

            NSError *error = nil;
            if(!self.totalNumberOfPeople) //set total number of people for this fetch used for show more records
            {
                self.totalNumberOfPeople = [context countForFetchRequest:request error:&error]; 
                NSLog(@"total number of people -> %d",self.totalNumberOfPeople);

            }

                self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:@"peopleCache"];
dispatch_async(dispatch_get_main_queue(), ^{
                    [self.delegate refreshPeoplelTableview];
                    NSLog(@"fetched objects -> %d",[self.fetchedResultsController.fetchedObjects count]);
                    NSLog(@"total number of people -> %d",self.totalNumberOfPeople);


                });
    }];
}];

実際context countforfetchrequestにはフェッチしますが、fetcheresultscontrollerはしません。

前もって感謝します!

4

1 に答える 1

0

「半永久的な」FRC(コントローラーのインスタンス変数)を使用していますが、「一時的な」MOCを使用するように設定しています。これは、誰も使用しなくなったときに消えます。

私はあなたが実際にやろうとしていることには従いませんが、「一時的な」MOCを保存すればうまくいくと思います。ただし、そもそもなぜこれをすべて行っているのかを尋ねる必要があります。

parentContextとperformBlockの間にコードを挿入します

    context.parentContext = peopleDoc.managedObjectContext;
    // Keep the MOC with the FRC...
    self.myBackgroundFetchingMoc = context;
    [context performBlock:^{
于 2012-07-02T23:22:52.723 に答える