细粒度通知旧/新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将已处于更新状态。 deletionsinsertions值将与更新后的状态相关,以便任何UI元素仍然显示contacts中每个项目的先前状态可能会更新为匹配。

不,我不认为这样做是不安全的。如果您将contacts的内容复制到NSArray,那么肯定会在通知之前捕获以前的contacts排序。 Realm对象虽然有效,但是如果contacts对象中的属性值发生更改,那么也会反映在数组中。

也就是说,在将对象从RLMResults复制到NSArray时,您需要小心。直接将每个对象传递给数组会导致它被Realm延迟加载,这可能会导致性能下降。

+0

谢谢@TiM。这很有帮助。我想在这里做的不是UI相关的。但是我需要知道更新后插入和删除的对象。你知道一个更好的方法来完成这个,而不需要将对象复制到NSArray中吗?在这些情况下,Realm可以传递结果集的两个副本,即上一版本和新版本。 –

+0

没问题!很高兴我能帮上忙!真的吗?目前,我们主要关注基于UI的更改的细粒度通知功能。那么你正在研究什么样的用例?我们很乐意听到这个消息!目前不在此刻。目前你最好的选择是NSArray方法。还有关于在通知块中提供“旧”对象的讨论,但目前添加会很困难和耗时。 – TiM

+0

我今天才看到这个回复。抱歉。我一直在关注Realm一段时间。我了解你的优先事项。我试图在同步解决方案中利用细粒度的通知。在那里我将AddressBook联系人同步到一个领域的表格中,之后我需要知道哪些联系人被添加/删除/更新,以便我可以将其传递到我们的远程服务器。 –