【问题标题】:Realm-cocoa: How to add notification inside other notification blockRealm-cocoa:如何在其他通知块中添加通知
【发布时间】:2023-03-06 06:51:01
【问题描述】:

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

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 毫秒,但这会导致竞争条件。

现在,我的问题是,当我执行导致第一个通知块执行的写入事务时,我在嵌套的 addNotificationBlock 处遇到RLMException: Cannot register notification blocks from within write transactions.

提前致谢!

【问题讨论】:

  • 我不确定你的问题是什么。在通知中添加通知块时遇到了什么问题?
  • 我正面临RLMException: Cannot register notification blocks from within write transactions. 似乎嵌套的 addnotifactionblock 已经触发了导致第一个通知块被执行的写入事务。 - 编辑原始问题。
  • 在通知块中隐式启动写入事务。因此,您不能从通知块注册通知。我们要问的是在通知块中注册的原因。如果你在街区外注册似乎并不重要。
  • 你解决了吗?
  • 好吧,没有干净的解决方案。我发现了一个不优雅和肮脏的解决方法:使用dispatch_after 将内部 addNotificationBlock 推迟到另一个线程,但这显然会导致竞争条件。我改变了我的整个程序逻辑,使得内部通知块不再需要了。

标签: ios objective-c realm


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2021-10-20
    相关资源
    最近更新 更多