- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 View Controller ,它打开一个模态视图 Controller 供用户从其库中选择图像。为此,我使用了我编写的 DKImagePickerController
的 Rx 包装器。
View Controller中的相关代码如下:
fileprivate func addPicturesFromLibrary() {
guard let viewModel = self.viewModel else { return }
let pickerController = DKImagePickerController()
pickerController.singleSelect = false
pickerController.maxSelectableCount = 10
pickerController.showsCancelButton = true
pickerController.sourceType = .photo
pickerController.rx.didSelectAssets()
.debug("👍 1")
.bind(to: viewModel.addAssetsInput)
.disposed(by: disposeBag)
self.present(pickerController, animated: true, completion: nil)
}
我的 View 模型如下所示:
class MediaViewModel {
var selectedImages = Variable<[MediaListingImage]>([])
public let addAssetsInput = PublishSubject<DKAsset>()
init() {
bind()
}
private func bind() {
addAssetsInput
.debug("👍 2")
.flatMap {
$0.rx.fetchOriginalImage()
}
.map {
MediaListingImage.local($0)
}
.subscribe(onNext: { [weak self] (mediaListingImage) in
self?.selectedImages.value.append(mediaListingImage)
})
.disposed(by: disposeBag)
}
}
当我打开第一个模式选择器时,它按预期工作。但是,当它释放时, View 模型中的绑定(bind) 也会释放,因此模态视图 Controller 的后续呈现将不起作用。
这是我在控制台中获得的日志,这可能有助于您理解我看到的内容:
2017-11-15 17:33:15.490: 👍 2 -> subscribed
2017-11-15 17:33:21.452: 👍 1 -> subscribed
2017-11-15 17:33:23.902: 👍 1 -> Event next(<DKImagePickerController.DKAsset: 0x6080002ab940>)
2017-11-15 17:33:23.902: 👍 2 -> Event next(<DKImagePickerController.DKAsset: 0x6080002ab940>)
2017-11-15 17:33:23.902: 👍 1 -> Event completed
2017-11-15 17:33:23.903: 👍 2 -> Event completed
2017-11-15 17:33:23.903: 👍 2 -> isDisposed
2017-11-15 17:33:23.903: 👍 1 -> isDisposed
2017-11-15 17:33:29.924: 👍 1 -> subscribed
2017-11-15 17:33:33.114: 👍 1 -> Event next(<DKImagePickerController.DKAsset: 0x60c0002a62a0>)
2017-11-15 17:33:33.114: 👍 1 -> Event completed
2017-11-15 17:33:33.114: 👍 1 -> isDisposed
如果我将 View Controller 中的代码更改为:
pickerController.rx.didSelectAssets()
.debug("👍 1")
.subscribe(onNext: { (asset) in
viewModel.addAssetsInput.onNext(asset)
})
.disposed(by: disposeBag)
它按预期工作。但是,我发现在这种情况下使用 bind
更优雅,如果可能的话我想继续使用它。
是什么触发了 View 模型中 PublishSubject
的绑定(bind)以进行处理?如何在不泄漏资源的情况下防止它?
最佳答案
我怀疑因为 completed
通过第二条链(MediaViewModel.bind
中的链)传播,它将不再接收任何事件。我想你会想在这里使用 subscribe(onNext: { ... })
而不是 bind
这样你就可以避免发送错误和完成事件。
另一种选择是使用 PublishRelay
而不是 PublishSubject
。
PublishRelay is a wrapper for
PublishSubject
. UnlikePublishSubject
it can't terminate with error or completed.
关于ios - RxSwift PublishSubject 被无意中处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47316858/
我正在处理这样的情况,我想在这里应用 RxSwift。 我有带有按钮的.xib UIView。 class RightButtonItemView: UIView { @IBOutlet we
我在 Playground 上玩 RxSwift 时遇到了警告。这是完整的警告消息: Synchronization anomaly was detected. - Debugging: To deb
为什么subscribe在这里从不打印任何内容?只是出于好奇。无论如何,这是一个坏习惯,我会改用observeOn,但是我无法弄清楚为什么从来没有达到subscribe ... fun main()
我正在尝试使用 RxJava 创建模型的代理,该代理允许其他人订阅模型中的更改。 这是我的代理的简化版本: class MyModelProxy { private static MyMode
我尝试使用 rx 和 PublishSubject .所以我创建对象: PublishSubject events = PublishSubject.create(); 在我的服务中,我输入了 MyE
PublishSubject 非常适合在观察者和可观察对象之间架起一座桥梁: Observable observable = Observable.just("string"); Pu
我知道,所有类型的 Rx 主题都可以获得订阅中未正确排序的元素,例如。如果我按 1、2、3 的顺序发送三个元素,则可以选择按以下顺序获取它:1、3、2。 我想知道,有没有办法强制发射元素在开始和结束时
我正在努力处理包含 RxSwift 的 PublishSubject 的特定用例。 为了简单起见,省略了不重要的细节。 有一个 MVVM 设置。在 VC 中,我有一个 UIButton,点击它应该发送
我有一个 View Controller ,它打开一个模态视图 Controller 供用户从其库中选择图像。为此,我使用了我编写的 DKImagePickerController 的 Rx 包装器。
我正在努力了解以下黄金法则(如果有的话): When to use BehaviorSubject ? 和 When to use PublishSubject ? 它们之间的区别很明显 There
谁能解释一下为什么 PublishSubject 不能很好地与 firstOrError() 一起工作? 我希望 firstOrError 在创建没有任何值的 PublishSubject 时返回 N
我正在尝试使用 PublishSubject 来转发按钮点击。但是,此 PublishSubject 会在初始化时触发,这会干扰我的逻辑。这就是我正在做的: var buttonClick = Pub
我将 Button pressed 绑定(bind)到路由器中的 PublishSubject,如下所示: hambugerButton .rx_tap .bindTo(router.op
我有一个已注册 doOnSubscribe 和 doOnUnsubscribe 操作的 PublishSubject。如果完成订阅,则不会调用这两个操作。 private PublishSubject
我在学习Viper带 RxSwift . 我想通知我的Presenter那viewDidLoad在我的 ViewController 中被调用. 为此,我有以下内容: class LoginPrese
我正在尝试测试我的 ViewModel 的主要功能。重要的步骤是测试加载状态完成。但可以肯定的是,为了更好的测试,测试所有状态可能会很有趣。 我正在阅读很多关于 RxTest 和 RxBlocking
我需要一种功能,允许将消息异步推送到我的 PublishSubject 并通过 ConnectableObservable 以一定的速度(实际上是一个接一个)处理它们。不幸的是,在底层的Subscri
RxJava 查询 : 你好, 我有一个 PublishSubject subject = PublishSubject.create() ; 我正在订阅上述主题并在此之后进行 API 调用: sub
我在我的项目中使用 ReactiveSwift,我想知道 PublishSubject 的等价物是什么? 例如在 RXSwift 中我们可以这样做: let disposeBag = DisposeB
我正在创建基于 CocoaAsyncSocket 和 STOMP 协议(protocol)的简单消息传递应用程序。所以我创建了主类,它使用 PublishSubject ,因此订阅者可以观察传入的 S
我是一名优秀的程序员,十分优秀!