Как регулировать наблюдаемое до тех пор, пока условие не станет истинным - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть представление коллекции в моем приложении, и оно обновит sh с анимацией при появлении нового контента или удалении. Однако я не хочу, чтобы он обновлял sh, пока пользователь выполняет прокрутку, потому что это может привести к рывкам. Я хочу обновить sh представление коллекции только тогда, когда пользователь завершил прокрутку / когда она не прокручивается.

Итак, у меня есть драйвер источника данных, и я попытался использовать filter, чтобы заставить его ждать его становится правдой, но не повезло.

Это мой драйвер прокрутки, который я передаю ViewModel

let isScrollViewScrollingDriver = Observable.merge(
            gridCollectionView.rx.willBeginDragging.map { _ in true },
            gridCollectionView.rx.didEndDragging.map { _ in false }
        ).asDriver(onErrorJustReturn: false).startWith(false).distinctUntilChanged()

моему ViewModel init в контроллере представления

viewModel = ViewModel(
            photoLibraryService: PhotoLibraryService.shared,
            isGridViewScrolling: isScrollViewScrollingDriver,
            disposeBag: disposeBag
        )

My ViewModel

let assetDriver = photoLibraryService.albumDriver.asObservable()
                .withLatestFrom(
                    isGridViewScrolling.asObservable().filter { $0 == false }
                ) { (arg0, arg1) in
                    return arg0
                }.flatMapLatest { libraryAlbum -> Observable<[LibraryAsset]> in
                    return photoLibraryService.convert(album: libraryAlbum)
                }.asDriver(onErrorJustReturn: []).startWith([]).distinctUntilChanged()

А затем я сопоставляю assetDriver с dataSourceDriver, который управляет моим представлением коллекции.

Какие изменения я могу внести в assetDriver, чтобы он ожидал, пока isGridViewScrolling станет false? Благодаря.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Вы можете использовать объединитьПоследний:

    let assetDriver = Driver
        .combineLatest(
            photoLibraryService.albumDriver,
            isGridViewScrolling
        )
        .filter { !$1 }
        .map { $0.0 }
        .flatMapLatest { libraryAlbum -> Driver<[LibraryAsset]> in
            photoLibraryService.convert(album: libraryAlbum)
                .asDriver(onErrorJustReturn: [])
        }
        .startWith([])
        .distinctUntilChanged()
0 голосов
/ 02 февраля 2020

Похоже, вам нужен мой оператор stallUnless(_:initial:). https://gist.github.com/danielt1263/2b624d7c925d8b7910ef2f1e5afe177b


    /**
     Emits values immediately if the boundary sequence last emitted true, otherwise collects elements from the source sequence until the boundary sequence emits true then emits the collected elements.
     - parameter boundary: Triggering event sequence.
     - parameter initial: The initial value of the boundary
     - returns: An Observable sequence.
     */
    func stallUnless<O>(_ boundary: O, initial: Bool) -> Observable<Element> where O: ObservableType, O.Element == Bool {
        return Observable.merge(self.map(Action.value), boundary.startWith(initial).distinctUntilChanged().materialize().map(Action.trigger).takeUntil(self.takeLast(1)))
            .scan((buffer: [Element](), trigger: initial, out: [Element]()), accumulator: { current, new in
                switch new {
                case .value(let value):
                    return current.trigger ? (buffer: [], trigger: current.trigger, out: [value]) : (buffer: current.buffer + [value], trigger: current.trigger, out: [])
                case .trigger(.next(let trigger)):
                    return trigger ? (buffer: [], trigger: trigger, out: current.buffer) : (buffer: current.buffer, trigger: trigger, out: [])
                case .trigger(.completed):
                    return (buffer: [], trigger: true, out: current.buffer)
                case .trigger(.error(let error)):
                    throw error
                }
            })
            .flatMap { $0.out.isEmpty ? Observable.empty() : Observable.from($0.out) }
    }
}
...