Подписки RxSwift после didBecomeActive - PullRequest
0 голосов
/ 30 октября 2019

Я написал модуль на основе 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 для наблюдателя, но я не уверен, что это правильный способ выяснить проблему. Есть идеи, в чем причина этого?

1 Ответ

0 голосов
/ 31 октября 2019

Наконец-то я решил эту проблему. Причина не была связана с Rx. Метод рисования картинок draw (_: CGRect) был вызван после didBecomeActive и очищен myView. Я изменил тело метода, и теперь все работает хорошо:)

...