【问题标题】:Reactive Cocoa - listening for notifications & memory managementReactive Cocoa - 监听通知和内存管理
【发布时间】:2014-01-31 00:53:18
【问题描述】:

我想知道其他人是否对 Reactive Cocoa listenForNotification 方法有一些问题。 我正在使用以下代码经历保留周期,并且从未调用我的 viewController dealloc 方法。 如果我不听那个通知,我的 viewController 就会被正确地释放

这是更新的完整代码块,我在其中调用方法来监听通知:

RACSignal *postSignal = [RACSignal empty];        
postSignal = [[[[NSNotificationCenter defaultCenter] rac_addObserverForName:kNotification object:self.conversation] takeUntil:self.rac_willDeallocSignal]] bind:^RACStreamBindBlock{
        return ^RACSignal *(NSNotification *note, BOOL *stop) {
            XXStatus status = [note.userInfo[@"status"] longValue];
            if (status == XXStatusPosted) {
                *stop = YES;
                return [RACSignal empty];
            } else {
                return [RACSignal error:note.userInfo[@"error"]];
            }
        };

[[[[RACSignal merge:@[uploadSignal, postSignal]] deliverOnMain] subscribeCompleted:^{
    [self doSomethingX];
} error:^(NSError *error) {
    [self doSomethingOnFail:error];
}] autoDispose:self];

您知道 RAC 内存管理如何用于收听通知吗?其中通知中心是应用程序中的默认通知中心。该方法包含在 NSObject 类的类别扩展中。

感谢您的回答。

【问题讨论】:

  • 该代码列表中没有来自 ReactiveCocoa 库的代码。
  • 忘记提及该方法属于 NSObject 类的类别,执行以下操作:[[notificationCenter rac_addObserverForName:name object:object] takeUntil:self.rac_willDeallocSignal] ... 将编辑我的问题谢谢
  • 仍然没有足够的代码来帮助你。大概您正在订阅您发布的代码行返回的信号;如果是这样,那么向我们展示订阅块的正文会对您有所帮助。
  • 感谢 Eric,我已经更新了我的帖子以包含更多信息。这就是我用来收听通知的基本结构。我还发布了我们稍后所做的,将信号与其他信号合并。希望这会有所帮助,我仍在经历保留周期。
  • 只是一个旁注。无需将 [RACSignal empty] 分配给变量,然后立即将其替换为另一个值。

标签: ios reactive-cocoa


【解决方案1】:

这并不是真正的完整代码 sn-p(它具有不平衡的分隔符),因此您可能不小心遗漏了一些可能会使它更清楚的内容。但它看起来就像你有一个保留周期的原因是在最后一行:

}] autoDispose:self];

self 的引用似乎不是弱引用,这意味着绑定块具有对@987654323 的strong(“所有权”)引用@。如果是这样,self 将永远不会被释放,因此self.rac_willDeallocSignal 永远不会发送值。 that 意味着观察者永远不会从NSNotificationCenter 中删除。

【讨论】:

  • Erik,不要担心不平衡的分隔符,这不是一个完整的代码,因为由于许可证的原因,我需要对其进行一些更改以隐藏真实代码。但好消息是您对强参考的看法是正确的!感谢您对此的帮助!
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2023-04-10
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多