0

私の最初のView Controllerで私がやっていることは、viewDidLoadのUIManagedDocumentからNSManagedObjectContextを設定することです

@property(strong, nonatomic) NSManagedObjectContext *managedObjectContext;

- (void)viewDidLoad
{
     NSURL *filePath = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
     filePath = [filePath URLByAppendingPathComponent:@"Locations"];
     UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:filePath];

    //Create if it doesn't exist
     if (![[NSFileManager defaultManager] fileExistsAtPath:[filePath path]]) {

        //Async save
        [document saveToURL:filePath forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
             if (success) {
                self.managedObjectContext = document.managedObjectContext;
             }
         }];
    } else if (document.documentState == UIDocumentStateClosed){
        [document openWithCompletionHandler:^(BOOL success){

             //Open it, don't need to refetch stuff
             if (success) {
                self.managedObjectContext = document.managedObjectContext;
             }
         }];
     } else {
         self.managedObjectContext = document.managedObjectContext;
     }
 }

次に、NSMangedObject サブクラスのカテゴリ メソッドを介して新しいオブジェクトを挿入します。

[Location createLocationWithName:@"Maui" inManagedObjectContext:self.managedObjectContext];

このコードを呼び出すだけです

Location *location = [NSEntityDescription insertNewObjectForEntityForName:@"Location" inManagedObjectContext:managedObjectContext];
[managedObjectContext save:nil];

今私が抱えている問題は、パブリック NSManagedObjectContext プロパティを持つ新しい ViewController にセグエし、prepareForSegue でこの managedObjectContext に設定すると、destinationViewController の NSFetchedResultsController がこの変更をすぐに取得しないことです。数回前に戻ると、最終的に上で作成した Location Maui が表示されます。新しいオブジェクトを managedObjectContext に挿入してから別のビュー コントローラーに渡すと、その変更が反映されない理由はありますか?

どんな洞察も大歓迎です。

4

1 に答える 1

0

作成メソッドに名前が含まれている場合は、少なくともこの属性も設定する必要があります (そうしないと失われます)。したがって、作成の実装の2行目:

location.name = name; // name is passed to the method

2 番目のビュー コントローラーのフェッチされた結果コントローラーがすぐに更新されるようにするには、FRC の作成時に を に設定cacheNameします。nil大量のレコードがあり、キャッシュが必要だと思われる場合は、次の手順でこれを行うことができますviewWillAppear:

[self.fetchedResultsController performFetch:&error];
于 2013-07-26T08:29:04.597 に答える