我使用Realm for Swift并将数据加载到UITableView中。当我进入屏幕时,大约有200个数据对象正在逐渐下载,因此在显示tableview后,在我的测试中发生了大量插入UITableView。我正在使用Realm示例尽可能地使用RealmCollectionChange添加NotificationBlock,并且我在此过程中偶尔会发生两次单独的崩溃。
即使我在ViewController类中提取主线程中的所有数据,也会发生此崩溃。
此更新仅在我更换
后才开始发生tableView.reloadData()
与
tableView.beginUpdates()
tableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
tableView.endUpdates()
是否有一些关于Realm的遗漏导致这种情况发生?我怀疑是因为我没有完全理解这个库的内部机制。
这是我的参考代码:
self.exhibits = DataManager.getAllExhibitsSorted("id")
token = self.exhibits?.addNotificationBlock { (changes: RealmCollectionChange) in
switch changes {
case .Initial(_):
self.exhibits = DataManager.getAllExhibitsSorted("id")
self.exhibitListTableView.reloadData()
break
case .Update(_, let deletions, let insertions, let modifications):
// Query results have changed, so apply them to the UITableView
self.exhibitListTableView.beginUpdates()
self.exhibitListTableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
self.exhibitListTableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
self.exhibitListTableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
self.exhibitListTableView.endUpdates()
break
case .Error:
NSLog("Error in notificationBlock")
break
}
}
答案 0 :(得分:2)
听起来你可能会在这里稍微复杂一点。
领域Results
对象是实时和自动更新的。在主运行循环的下一次迭代中,对其底层对象所做的意义更改会自动更新,因此无需对它们执行手动重新获取。在您的代码中,您在生成令牌后,在self.exhibits
更改通知中重新分配.Initial
,这可能会导致您的一些问题。如果删除该行,它应该继续工作。
我建议您浏览一下代码,并确保self.exhibits
仅被分配一次,并且更改通知方法仅适用于该代码。
如果没有解决它,请告诉我。