我目前用于从领域集合更改中更新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中复制相同的行为。 谢谢。
答案 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提供支持,我们选择“扁平化”移动以解决此问题。