2017-01-17 2 views
0

У меня есть класс с одним первичным ключом и одним индексированным свойством.Отсутствует уведомление при изменении объекта

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

Задав вопрос, я написал минимальный проект, чтобы продемонстрировать эту проблему. И похоже, что демонстрационный проект просто отлично работал. Я сравнивал строку с кодом моего приложения и обнаружил, что эта проблема была вызвана предыдущей транзакцией, которая отключила токен уведомлений для следующего вызова.

RLMRealm *realm = [RLMRealm defaultRealm]; 
[realm beginWriteTransaction]; 
// any changes there 
[realm commitWriteTransactionWithoutNotifying:@[_bookmarksNotificationToken] error:nil]; 

Этот код отключает один звонок _bookmarksNotificationToken. Независимо от того, что это будет вызвано этой транзакцией или любой другой транзакцией в будущем. И это было неожиданно. Потому что я думал, что список игнорируемых уведомлений хранится за транзакцию, а это всего лишь счетчик ignore-next-N-calls внутри RLMNotificationToken.

Смежные вопросы