如何停止订阅单例类的流?

Posted

技术标签:

【中文标题】如何停止订阅单例类的流?【英文标题】:How to stop the subscription of a stream of a singleton class? 【发布时间】:2020-11-03 21:56:01 【问题描述】:

如何停止订阅单例类的流,并且在重新创建订阅时不继续该流的数据?

class MyClass 
  static MyClass _instance;

  factory MyClass() 
    _instance ??= MyClass._internal();
    return _instance;
  

  MyClass._internal();

  final BehaviorSubject<Status> _streamController = BehaviorSubject<Status>();
  Stream<Status> get stream => _streamController.stream;
  Function(Status) get sink => _streamController.sink.add;

  StreamSubscription subscriptionImage;

  void dispose() 
    _streamController?.close();
  

  void listen() 
    subscriptionImage = stream.listen((Status statusAnalysis) async 
      if (statusAnalysis.saving) 
        try 
          await patch(statusAnalysis);
         on MyException catch (e) 
      
    );
  

【问题讨论】:

【参考方案1】:

只需在前面添加subscriptionImage?.cancel();

subscriptionImage = stream.listen((Status statusAnalysis)...);

并且您将确保在创建新订阅之前取消之前的订阅(如果有)。

【讨论】:

该流将图像发送到服务,我没有在小部件中使用它,而是在一个类中使用它,但由于某种原因取消订阅后数据流继续其过程并且不会被丢弃 我看到当我再次调用这个单例类的listen方法时,里面的代码被执行了 在被取消和重新订阅后它可以被执行的唯一方法,这是因为异步调用可能已经在进行中,尽管取消了订阅,你实际上不能取消正在进行的调用。你可能想看看CancelableOperation 我用 Cancelable Operation 进行了测试,但结果相同,最后它最终执行了所有操作

以上是关于如何停止订阅单例类的流?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中 BasicObject 的单例类的单例类

如何快速创建单例类? [复制]

单例类的总结

如何防止JAVA反射对单例类的攻击?

Swift 中蓝牙单例类的视图控制器中的观察者

单例类和元类