Я написал модуль на основе RxSwift с Viewcontroller и ViewModel. ViewModel содержит наблюдателей жестов и наблюдаемых изображений. Все работает хорошо, за исключением ситуации, когда приложение didBecameActive
непосредственно к указанному модулю. Подписки на жесты не работают и imageView
становятся пустыми.
Они устанавливаются внутри подписки на наблюдаемые на основе BehaviorSubjects
, вид изнутри:
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
инициализируется в initModel viewModel
photosSubject = BehaviorSubject<PictureCollection>(value: collection)
photosObservale
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
не равно nil, но оно исчезает. Я мог бы прослушать уведомление didBecameActive
и вызвать onNext
для наблюдателя, но я не уверен, что это правильный способ выяснить проблему. Есть идеи, в чем причина этого?