领域是否具有fetchResultsController的.NSFetchedResultsChangeMove:

时间:2016-11-18 23:20:54

标签: ios swift core-data realm

我目前用于从领域集合更改中更新tableView的代码如下:

 func updateUI(changes: RealmCollectionChange<Results<Task>>) {
switch changes {
case .Initial(_):
  tableView.reloadData()
case .Update(_, let deletions, let insertions, let modifications):

  tableView.beginUpdates()


  if !(insertions.isEmpty) {

    tableView.insertRowsAtIndexPaths(insertions.map {NSIndexPath(forRow: $0, inSection: 0)},
                                     withRowAnimation: .Automatic)


  }


  if !(deletions.isEmpty) {

    tableView.deleteRowsAtIndexPaths(deletions.map {NSIndexPath(forRow: $0, inSection: 0)},
                                     withRowAnimation: .Automatic)



  }

  if !(modifications.isEmpty) {

    tableView.reloadRowsAtIndexPaths(modifications.map {NSIndexPath(forRow: $0, inSection: 0)}, withRowAnimation: .Automatic)


  }







  tableView.endUpdates()
  break



case .Error(let error):
  print(error)
}
  }

之前使用过Core-data而不是Realm,fetchedResultsController有一个非常方便的方法NSFetchedResultsChangeMove,当我对核心数据中的内容进行排序时。如苹果文档中所示,当某些内容移动时,它在表中的当前位置将被删除,然后插入一个新位置(是的,我确实认识到它是客观的C,我的代码很快,但这是一个明显的例子)。

  - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {

UITableView *tableView = self.tableView;

       switch(type) {

    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                   withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeDelete:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                   withRowAnimation:UITableViewRowAnimationFade];
        break;

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

    case NSFetchedResultsChangeMove:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                   withRowAnimation:UITableViewRowAnimationFade];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                   withRowAnimation:UITableViewRowAnimationFade];
        break;
}

}

从代码中可以看出,realm似乎只有移动参数。正如我正在制作一个聊天应用程序,当我使用核心数据时,移动是非常宝贵的,我希望在Realm中复制相同的行为。 谢谢。

1 个答案:

答案 0 :(得分:0)

我们希望在收集通知中包含移动操作。我们在此处跟踪该功能:https://github.com/realm/realm-cocoa/issues/3571

从那个GitHub问题:

  

好消息是,Realm内部已经计算了移动操作。

     

坏消息是,移动操作会在更改计算算法的最后转换为插入和删除:https://github.com/realm/realm-object-store/blob/28ac73d8881189ac0b6782a6a36f4893f326397f/src/impl/collection_change_builder.cpp#L35-L38

     

我模糊地回忆起这是因为UITableView API不能非常好地处理移动操作,尽管有完全有效的结果,它们会在某些情况下崩溃。因为插入/删除对从未发生这种情况,并且此功能将在99%的时间内用于为UITableView提供支持,我们选择“扁平化”移动以解决此问题。