NSFetchedResultsController非常慢

时间:2014-01-11 02:54:34

标签: ios objective-c core-data nsfetchedresultscontroller

发生了什么:

每当我创建新的Core Data对象时,我的应用程序都会挂起大约3秒钟。该对象不是一个大的或复杂的对象。

-

详细信息:

按下按钮,会创建一个新对象,设置属性,然后使用以下命令保存:

[[SharedCoreDataBackend managedObjectContext] save:&error];

这导致NSFetchedResultsController更新如下。我已经缩减了以下几行代码的速度:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 

    [self.tableView beginUpdates];

    [self.tableView deleteRowsAtIndexPaths:self.deletedRowIndexPaths withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView insertRowsAtIndexPaths:self.insertedRowIndexPaths withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView reloadRowsAtIndexPaths:self.updatedRowIndexPaths withRowAnimation:UITableViewRowAnimationNone];

    [self.tableView endUpdates];
}

-

所以......

任何想法是什么问题?是否还有一些我可以发布的测试或代码可以帮助解决这个问题?

2 个答案:

答案 0 :(得分:5)

尝试使用像这样的委托方法......

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

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

            case NSFetchedResultsChangeDelete:
            {   
                [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            }
                break;

            case NSFetchedResultsChangeUpdate:
            {   
                [self configureCell:tableView cell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            }
                break;

            case NSFetchedResultsChangeMove:
            {   
                [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
                [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            }
                break;
        }
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
        [self.tableView endUpdates];
}

答案 1 :(得分:0)

对于我的同伴Swifters希望我能救你几秒钟:

{{1}}