Realm-cocoa:如何在其他通知块中添加通知

时间:2017-11-16 21:29:14

标签: ios objective-c realm

在我的应用程序中,我已经注册了一个通知块,它本身必须注册另一个通知块。

notificationToken = [self.appState.currentProject addNotificationBlock:^(BOOL deleted, NSArray<RLMPropertyChange *> *changes, NSError *error) {
if (deleted) {
    NSLog(@"The object was deleted.");
} else if (error) {
    NSLog(@"An error occurred: %@", error);
} else {
    bool filterChanged = false;
    for (RLMPropertyChange * change in changes){
        if([change.name isEqualToString:@"filters"])
            filterChanged = true;
    }
    if(filterChanged){
        // compute predicate from filters
        // predicate = [NSPredicate ...
        styles = [Style objectsWithPredicate:predicate]
        notificationTokenStyles = [styles addNotificationBlock:^(RLMResults<Style *> * _Nullable results, RLMCollectionChange * _Nullable change, NSError * _Nullable error) {
            // react on changed styles.
        }]; // <- RLMException here
    }
}];
}
}];

我知道这在技术上是不可能的,但对我来说这是必要的。我可以以某种方式将嵌套的addNotificationBlock调度或推迟到另一个线程吗?我知道我可以等待500毫秒,但这会导致竞争状态。

现在,我的问题是,只要我执行导致第一个通知块执行的wirte事务,我就会在嵌套的addNotificationBlock中遇到RLMException: Cannot register notification blocks from within write transactions.

提前致谢!

1 个答案:

答案 0 :(得分:0)

这是一个已知问题(请参见this Realm issue on GitHub)。

您可以像这样包装新NotificationToken的创建(Swift代码):

DispatchQueue.main.async {
    // register observation blocks here
}

或者您可以在开始写事务之前致电realm.refresh()