Iphone 在应用程序重新启动之前,NSFetchedResultsController中的核心数据插入不可见

Iphone 在应用程序重新启动之前,NSFetchedResultsController中的核心数据插入不可见,iphone,objective-c,core-data,ios5,storyboard,Iphone,Objective C,Core Data,Ios5,Storyboard,我遇到了一个令人困惑的问题: 我只定义了一种将对象插入核心数据的方法。我尝试以两种不同的方式插入数据:一种是使用+按钮从UITableView插入数据。另一个是通过调用下面的方法从常规UIViewController获得的 在该方法的末尾,在这两种情况下,该方法都返回NSManagedObject,但只有在从UITableViewController插入的情况下,FetchedObject计数才会增加 如果我首先加载UITableViewController,则对该方法的所有后续调用都会正确地增

我遇到了一个令人困惑的问题:

我只定义了一种将对象插入核心数据的方法。我尝试以两种不同的方式插入数据:一种是使用+按钮从UITableView插入数据。另一个是通过调用下面的方法从常规UIViewController获得的

在该方法的末尾,在这两种情况下,该方法都返回NSManagedObject,但只有在从UITableViewController插入的情况下,FetchedObject计数才会增加

如果我首先加载UITableViewController,则对该方法的所有后续调用都会正确地增加获取对象的数量。如果不这样做,则数字保持不变,即使nsManagedObject是从该方法返回的在随后的应用程序重新启动时,将再次加载“不可见”对象并使其可见

在我看来,问题在于ManagedObjectContext,但我看不出我在哪里错误地设置了它

该项目使用iOS5、ARC和故事板

-(Event*)insertAndReturnNewEventWithSeverity:(int)type
{
    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];

    Event *newManagedObject = (Event*)[NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];


    newManagedObject.insert_datetime = [NSDate date];



    NSError *error = nil;
    if (![context save:&error]) {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        //        abort();
    }

    NSLog(@"objects: %i", self.fetchedResultsController.fetchedObjects.count );

    return newManagedObject;
}
只有一个managedObject上下文,它在应用程序委托中初始化

-(NSManagedObjectContext*)managedObjectContext
{
    if(__managedObjectContext!=nil)
    {
        return  __managedObjectContext;
    }else{

        self.managedObjectContext = self.appDelegate.managedObjectContext;    
    }
    return __managedObjectContext;
}
更新: 将my
UIViewController
作为委托添加到
NSFetchedResultsController
,并添加didChangeObject和didChangeSection会导致.fetchedObjects属性正确地递增自身

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.coreDataManager.fetchedResultsController.delegate = self;
}

    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
           atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
          newIndexPath:(NSIndexPath *)newIndexPath
    {
        NSLog(@"Changed object");
    }

    - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
               atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
    {
      NSLog(@"Changed section");
    }
-(void)viewDidLoad
{
[超级视图下载];
//加载视图后,通常从nib执行任何其他设置。
self.coreDataManager.fetchedResultsController.delegate=self;
}
-(void)控制器:(NSFetchedResultsController*)控制器didChangeObject:(id)一个对象
atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)类型
newindepath:(nsindepath*)newindepath
{
NSLog(@“变更对象”);
}
-(void)控制器:(NSFetchedResultsController*)控制器didChangeSection:(id)sectionInfo
atIndex:(nsInteger)ChangeType:(NSFetchedResultsChangeType)类型的节索引
{
NSLog(“变更部分”);
}

谢谢你的帮助

NSFetchedResultsController要求设置委托以监视获取结果中的更改

因此,控制器有效地具有三种运行模式,即: 是否具有委托以及是否设置了缓存文件名

无跟踪:委托被设置为零。控制器简单 按执行提取时的状态提供对数据的访问

>仅内存跟踪:委托为非零,文件缓存名为 设置为零。控制器监视其结果集中的对象,并 更新章节和订购信息以响应相关要求 更改。

完全持久跟踪:委托和文件缓存名称为 非零。控制器监视其结果集中的对象并进行更新 章节和订购信息,以响应相关更改。这个 控制器维护其运行结果的持久缓存 计算


NSFetchedResultsController要求设置委托以监视获取结果中的更改

因此,控制器有效地具有三种运行模式,即: 是否具有委托以及是否设置了缓存文件名

无跟踪:委托被设置为零。控制器简单 按执行提取时的状态提供对数据的访问

>仅内存跟踪:委托为非零,文件缓存名为 设置为零。控制器监视其结果集中的对象,并 更新章节和订购信息以响应相关要求 更改。

完全持久跟踪:委托和文件缓存名称为 非零。控制器监视其结果集中的对象并进行更新 章节和订购信息,以响应相关更改。这个 控制器维护其运行结果的持久缓存 计算


为了让NSFetchedResultsController的FetchedObject正确计数,您需要为NSFetchedResultsController设置一个委托

苹果对此有何评论:

控制器的委托 如果为获取的结果控制器设置委托,则控制器将注册以从其托管对象上下文接收更改通知。对影响结果集或节信息的上下文中的任何更改进行处理,并相应地更新结果。当结果对象更改位置或修改节时,控制器通知委托(请参阅NSFetchedResultsControllerDelegate)。通常使用这些方法来更新表视图的显示


为了使NSFetchedResultsController的FetchedObject正确计数,您需要设置NSFetchedResultsController的委托

苹果对此有何评论:

控制器的委托 如果为获取的结果控制器设置委托,则控制器将注册以从其托管对象上下文接收更改通知。对影响结果集或节信息的上下文中的任何更改进行处理,并相应地更新结果。当结果对象更改位置或修改节时,控制器通知委托(请参阅NSFetchedResultsControllerDelegate)。通常使用这些方法来更新表视图的显示


您是否正在为NSFetchedResultsController使用委托?如果是,是否调用了didChangeObject方法?我仅在UITableViewController中设置委托,并且didChangeObject仅为UITableViewController实现,将我的UIViewController作为委托添加到NSFetchedResultsController,添加didChangeObject和didChangeSection会导致.FetchedObject属性正确递增