【发布时间】:2019-10-30 17:20:57
【问题描述】:
我已经使用 Viewcontroller 和 ViewModel 编写了基于 RxSwift 的模块。 ViewModel 包含手势的观察者和图像可观察者。一切正常,除了应用程序didBecameActive 直接到提到的模块的情况。手势订阅不起作用,imageView 变为空白。
它们在订阅内设置为基于 BehaviorSubjects 的 observable,内部视图:
func subscribePhotos(observerable: Observable<[(Int, UIImage?)]>) {
disposeBag = DisposeBag()
observerable.subscribeOnNext { [weak self] array in
array.forEach { identifier, image in
if let pictureView = self?.subviews.first(where: { view -> Bool in
guard let view = view as? PictureView else {
return false
}
return view.identifier == identifier
}) as? PictureView {
pictureView.set(image)
}
}
}.disposed(by: disposeBag)
}
在viewModel中我设置了Observable:
var imagesObservable: Observable<[(Int, UIImage?)]> {
do {
let collection = try photosSubject.value()
if let photosObservables = collectionCreator?.getPhotosDetailsObservables(identifiers: collection.photoIdentifiers) {
let photosObservable = Observable.combineLatest(photosObservables)
return Observable.combineLatest(photosSubject, photosObservable,
resultSelector: { collection, currentArray -> [(Int, UIImage?)] in
var newArray = [(Int, UIImage?)]()
currentArray.forEach { stringIdentifier, image in
if let picture = grid.pictures.first(where: { $0. stringIdentifier == stringIdentifier }) {
newArray.append((picture.identifier, image))
}
}
return newArray
})
}
} catch { }
return Observable<[(Int, UIImage?)]>.never()
}
}
photosSubject 在 viewModel 的 init 中初始化
photosSubject = BehaviorSubject<PictureCollection>(value: collection)
照片观察
func createImageObservableForAsset(asset: PHAsset, size: CGSize) -> Observable<UIImage?> {
return Observable.create { obs in
PHImageManager.default().requestImage(for: asset,
targetSize: size,
contentMode: .aspectFit,
options: nil,
resultHandler: { image, _ in
obs.onNext(image)
})
return Disposables.create()
}
}
在 ViewController 中我通过调用 view 的方法来连接它们:
myView.pictureView.subscribePhotos(observerable: viewModel.imagesObservable)
在didBecameActive 之后pictureView 的UIImage 类型的属性图像不为零,但它们消失了。我可以收听通知didBecameActive 并在观察者上调用onNext,但我不确定这是找出问题的正确方法。知道这是什么原因吗?
【问题讨论】: