细粒度通知旧/新RLMResults
问题描述:
我想在写入事务后找出插入/删除的对象。细粒度通知旧/新RLMResults
随着细粒度通知块,我可以得到:
/// The indices of objects in the previous version of the collection which have
/// been removed from this one.
@property (nonatomic, readonly) NSArray<NSNumber *> *deletions;
/// The indices in the new version of the collection which were newly inserted.
@property (nonatomic, readonly) NSArray<NSNumber *> *insertions;
我的问题是在这个片段:
RLMResults *contacts = [CYRLMAddressBookContact allObjects];
RLMNotificationToken *token = [contacts addNotificationBlock:^(RLMResults *_Nullable results,
RLMCollectionChange *_Nullable change,
NSError *_Nullable error) {}];
能contacts
被视为集合的“以前的版本”?
如果不是可以将contacts
转换为NSArray
并且这将是集合的“先前版本”?
答
在此代码示例中,当通知块触发时,contacts
将已处于更新状态。 deletions
和insertions
值将与更新后的状态相关,以便任何UI元素仍然显示contacts
中每个项目的先前状态可能会更新为匹配。
不,我不认为这样做是不安全的。如果您将contacts
的内容复制到NSArray
,那么肯定会在通知之前捕获以前的contacts
排序。 Realm对象虽然有效,但是如果contacts
对象中的属性值发生更改,那么也会反映在数组中。
也就是说,在将对象从RLMResults
复制到NSArray
时,您需要小心。直接将每个对象传递给数组会导致它被Realm延迟加载,这可能会导致性能下降。
谢谢@TiM。这很有帮助。我想在这里做的不是UI相关的。但是我需要知道更新后插入和删除的对象。你知道一个更好的方法来完成这个,而不需要将对象复制到NSArray中吗?在这些情况下,Realm可以传递结果集的两个副本,即上一版本和新版本。 –
没问题!很高兴我能帮上忙!真的吗?目前,我们主要关注基于UI的更改的细粒度通知功能。那么你正在研究什么样的用例?我们很乐意听到这个消息!目前不在此刻。目前你最好的选择是NSArray方法。还有关于在通知块中提供“旧”对象的讨论,但目前添加会很困难和耗时。 – TiM
我今天才看到这个回复。抱歉。我一直在关注Realm一段时间。我了解你的优先事项。我试图在同步解决方案中利用细粒度的通知。在那里我将AddressBook联系人同步到一个领域的表格中,之后我需要知道哪些联系人被添加/删除/更新,以便我可以将其传递到我们的远程服务器。 –