NSFetchedResultsController在objectAtIndexPath上崩溃? [英] NSFetchedResultsController crashes on objectAtIndexPath?

查看:134
本文介绍了NSFetchedResultsController在objectAtIndexPath上崩溃?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试访问 NSFetchedResultsController 中的对象时,我遇到崩溃。

  2013-11-10 15:15:06.568 Social [11503:70b] CoreData:error:严重的应用程序错误。在核心数据更改处理期间捕获异常。这通常是NSManagedObjectContextObjectsDidChangeNotification的观察器中的错误。 ***  -  [__ NSArrayI objectAtIndex:]:索引2超出空数组的范围与userInfo(null)
2013-11-10 15:15:06.570 Social [11503:70b] ***由于未捕获而终止应用程序exception'NSRangeException',reason:'*** - [__ NSArrayI objectAtIndex:]:index 2超出空数组的范围

viewDidLoad

   - (void)viewDidLoad 
{
[super viewDidLoad];

self.resultController = [DataEngine sharedInstance] .postsFetchedResultController;
self.resultController.delegate = self;
[self.resultController performFetch:nil];

[self.tableView reloadData];

[[DataEngine sharedInstance] fetchInBackground];
}

结果控制员委托
$ b

  #pragma mark  -  NSFetchedResultsControllerDelegate方法 -  

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType :(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
switch(type)
{
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths :@ [indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
break;

case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:@ [indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
break;

case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:@ [indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
break;

case NSFetchedResultsChangeMove:
[self.tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath];
break;

默认值:
break;
}
}

表视图 p>

  #pragma mark  -  UITableView Delegate& Dataset  -  

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.resultController.fetchedObjects.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self cellForRowAtIndexPath:indexPath];
}


解决方案

在我的一个NSManagedObject子类我有下面的代码,导致的问题。 NSSets在NSManagedObejcts上自动初始化,不需要初始化它们。

   - (void)awakeFromFetch 
{
if(!self.comments)
self.comments = [NSMutableSet set];

if(!self.medias)
self.medias = [NSMutableSet set];另一个问题是,在插入indexPath是null的时候,我不得不使用newIndexPath,而不是使用newIndexPath来代替。

  case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:@ [newIndexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
break;


I'm getting a crash when trying to access an object in NSFetchedResultsController.

2013-11-10 15:15:06.568 Social[11503:70b] CoreData: error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  *** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds for empty array with userInfo (null)
2013-11-10 15:15:06.570 Social[11503:70b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds for empty array'

viewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.resultController = [DataEngine sharedInstance].postsFetchedResultController;
    self.resultController.delegate = self;
    [self.resultController performFetch:nil];

    [self.tableView reloadData];

    [[DataEngine sharedInstance] fetchInBackground];
}

Result Controller Delegate

#pragma mark - NSFetchedResultsControllerDelegate Methods -

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller
   didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath
     forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    switch (type)
    {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertRowsAtIndexPaths:@[indexPath]
                                  withRowAnimation:UITableViewRowAnimationAutomatic];
            break;

        case NSFetchedResultsChangeUpdate:
            [self.tableView reloadRowsAtIndexPaths:@[indexPath]
                                  withRowAnimation:UITableViewRowAnimationAutomatic];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteRowsAtIndexPaths:@[indexPath]
                                  withRowAnimation:UITableViewRowAnimationAutomatic];
            break;

        case NSFetchedResultsChangeMove:
            [self.tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath];
            break;

        default:
            break;
    }
}

table view

#pragma mark - UITableView Delegate & Datasrouce -

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.resultController.fetchedObjects.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [self cellForRowAtIndexPath:indexPath];
}

解决方案

In one of my NSManagedObject subclasses I had the follwiing code which was causing the issue. NSSets are automatically initialized on NSManagedObejcts and there is no need to initialize them.

- (void)awakeFromFetch
{
    if (!self.comments)
        self.comments = [NSMutableSet set];

    if (!self.medias)
        self.medias = [NSMutableSet set];
}

Another problem was that during insert indexPath is null, I had to use newIndexPath instead

case NSFetchedResultsChangeInsert:
    [self.tableView insertRowsAtIndexPaths:@[newIndexPath]
                          withRowAnimation:UITableViewRowAnimationAutomatic];
    break;

这篇关于NSFetchedResultsController在objectAtIndexPath上崩溃?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆