SwiftUI+Combineでアプリ開発をしています。
Rxは使ったことがあるのですがCombineは初めてで諸々困惑する部分があります。
その一つが、sinkした時に出てくるAnyCancellable
を、クラス内に保持しないとサブスクリプションがキャンセルされるという仕様です。
swift
1class AnyClass { 2 func anyMethod() { 3 anyPublisher.sink{ ~~ } // AnyCancellableを保持していないので暗黙的にサブスクリプションがキャンセルされる 4 } 5}
swift
1class AnyClass { 2 var subscription: AnyCancellable? 3 func anyMethod() { 4 self.subscription = anyPublisher.sink{ ~~ } // AnyCancellableを保持したので購読される 5 } 6}
ところが、SwiftUIコード上でこれを実現しようとしても、SwiftUIは構造体でイミュータブルなので、subscription
を更新できません。
ということは、基本的にCombineフレームワークは、SwiftUI上でpublisherを受け取り、sinkするという作りを想定していないのかな?と思いました。
C#のRxでは、IObservable<T>
を公開して好きに購読してもらうという設計は一般的だったので、これと同じようなことがなぜか実現できないSwiftUIとCombineに少し困惑しているのですが、実際のところどうなのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/03/24 17:16