NSManagedObject 传递给 ViewController 是不是反映所有更新

Posted

技术标签:

【中文标题】NSManagedObject 传递给 ViewController 是不是反映所有更新【英文标题】:NSManagedObject passed to ViewController Does Reflect All UpdatesNSManagedObject 传递给 ViewController 是否反映所有更新 【发布时间】:2013-07-26 04:04:59 【问题描述】:

在我的第一个视图控制器中,我正在做的是从我的 viewDidLoad 中的 UIMangedDocument 设置 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 然后将其传递给另一个视图控制器的任何想法都不能反映这种变化?

非常感谢任何见解。

【问题讨论】:

【参考方案1】:

如果你的创建方法包含名字你至少也应该设置这个属性(否则它会丢失)。所以你的创作实施的第二行:

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

为了确保第二个视图控制器的抓取结果控制器立即更新,您可以在创建 FRC 时将cacheName 设置为nil。如果你有很多记录并且认为你需要缓存,你可以在viewWillAppear这样做:

[self.fetchedResultsController performFetch:&error];

【讨论】:

我已经实现了所有这些,但是在转换到另一个视图控制器时仍然没有看到我最近的插入 见上面的reloadData。如果仍然没有运气,请确保您保存了您希望看到的内容。通过sqlite3 命令行工具或Firefox 的SQLiteManager 签入物理数据库。

以上是关于NSManagedObject 传递给 ViewController 是不是反映所有更新的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 传递给 ViewController 是不是反映所有更新

将 NSManagedObject 传递给子上下文不起作用

将对 NSManagedObject 的属性的引用传递给后台线程

如何在iOS中将触摸传递给手势识别器?

restkit 0.20:无法将 NSManagedObject 传递给 getObject: 方法

如何将 NSManagedObject 传递给 NSPredicate 以及如何保存一对多的实体