我在iOS Swift项目中使用Realm已有1.5年。它运作良好,易于理解和使用。但是,随着应用程序变得越来越大,我在正确管理数据更新方面遇到了一些问题-一个组件使用某些数据,而其他组件则在不同的位置获取并同时保存。 我的解决方案是进行某种订阅(如Rx),该订阅将通知所有使用此数据的组件从领域刷新它。而且有效。
但是,假设我有一个使用一些数据X的屏幕A。当您单击列表项时,它会显示X的详细信息。这些详细信息是非常简单的ViewX,我只将数据X传递给了它。 然后在后台发生了一些事情,新的数据X已从服务器中获取并保存到Realm。但是ViewX不知道有关更新的信息,因此在尝试使用X对象时会发生“对象已被删除或无效”的现象,这是合理的。旧对象X已被删除,因此我们无法访问它。 有3种解决方案: 1)添加一个对ViewX的订阅(但是IMO这个视图太小了,无法拥有这种东西-那里的逻辑不足 2)不要传递对象X,而只是传递其ID。当ViewX想要使用它时-它会通过其ID从Realm加载数据。但是,并非每个对象都有其唯一的ID。 3)不要传递对象X,但它是副本。
我认为最好的是选项3。我尝试了一下,效果很好。但是,我想知道为什么以及何时应该直接访问对象X,以及为什么以及何时使用其副本。也许我应该总是使用副本。因此,每次使用realm.objects(Class)
时,我都应该这样做:let objects = realm.objects(Class).map { (obj) -> Class in obj.copied* }
。
这样做的好处是用法将保持一致-始终传递副本。因此,我不必视情况而定是否应该传递直接对象,它是副本还是id。
但是这种方法可能有一些缺点。你觉得呢?
* copied
从其原始变量等创建新对象。
谢谢!