根据我对 Dart 的理解 Stream
在 StreamSubscription.cancel()
之前,所有听众都将作为引用。叫做。这意味着在流也被销毁之前,我的监听对象不会从内存中删除。
一旦我不再需要该对象,是否有任何标准模式可以确保我取消所有内部监听器?这甚至是 Dart 中的一个问题,还是我误解了这个概念?
我能想到的一种解决方案是 destroy
或 cancelSubscriptions
一旦我知道不再需要对象,就必须手动调用该方法。
最佳答案
如果订阅者和引用流的实例都受到垃圾收集(某些事件实例未引用)的影响,则连接不应该计算在内,并且两个实例都应该被垃圾收集(但我不确定这一点)。
我还没有看到任何模式。
当我只想取消所有订阅时,我将它们存储在一个集合中并运行
subscriptions.forEach(s) {
s.cancel();
}
subscriptions.clear();
当我想在不同情况下取消重新订阅时,我会为每个此类订阅创建一个变量。
var someSubscr = xxx.listen(...);
...
if(someSubscr != null) someSubscr.cancel();
someScubscr = null;
我只在 Polymer 元素中使用它,我使用
detached
退订和attached
订阅。当我在其他情况下需要时,我只需将上面的代码放入
dispose
方法并在我知道不再需要该实例时调用它。我认为创建一个接口(interface)并为应该具有
dispose
的类实现它会很好。方法。abstract class Disposable {
void dispose();
}
当您有某种工厂为您创建实例并且您不确定该实例是否需要调用
dispose
时当您完成使用它时,只需添加此行就可以确保安全。if(x is Disposable) x.dispose();
有一个功能请求让 VM 调用析构函数或 dispose 方法
但不确定是否会实现。
还有相关的:
关于dart - 可以删除对象后取消内部流订阅的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26123034/