我有一个包含一个主键和一个索引属性的类。
ModelBookmark.h
@interface ModelBookmark : RLMObject
@property NSString *uuid;
@property NSString *folderUuid;
@end
ModelBookmark.m
@implementation ModelBookmark
+ (NSArray *)indexedProperties
{
return @[@"folderUuid"];
}
+ (NSString *) primaryKey
{
return @"uuid";
}
-(void) changeFolder:(NSString *)newFolderUUID
{
if(![self.folderUuid isEqualToString:newFolderUUID])
{
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
self.folderUuid = newFolderUUID;
[realm commitWriteTransaction];
}
}
@end
在某些表格中,我希望收到有关所有更改的通知。我写道:
RLMRealm *realm = [RLMRealm defaultRealm];
__weak MyCollectionsViewController *wself = self;
_bookmarksNotificationToken = [[ModelBookmark allObjectsInRealm:realm] addNotificationBlock:^(RLMResults *results, RLMCollectionChange *change, NSError *error) {
[wself updateFolderChilds:results change:change];
}];
似乎一切都很好,应该有效。但事实并非如此。当我更改folderUuid
时,我只有50%的机会收到有关更改的通知。
我怎样才能检查出错的是什么?
答案 0 :(得分:0)
在提出问题后,我写了一个最小的项目来证明这个问题。似乎演示项目运行良好。我使用我的应用程序的代码对行进行了比较,发现此问题是由以前的事务引起的,该事务禁用了下一次调用的通知令牌。
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
// any changes there
[realm commitWriteTransactionWithoutNotifying:@[_bookmarksNotificationToken] error:nil];
此代码禁用_bookmarksNotificationToken
的一次调用。无论将来该交易还是任何其他交易都将触发。那是出乎意料的。因为我认为,每个交易都存储了忽略通知列表,而它只是ignore-next-N-calls
内的RLMNotificationToken
计数器。