Как предотвратить прекращение наблюдаемых - PullRequest
0 голосов
/ 09 октября 2018
let loadNextPageTrigger = PublishSubject<Void>()

let loading = Variable<Bool>(false)


let nextPageRequest = loading.asObservable()

    .sample(loadNextPageTrigger)

    .flatMap { [unowned self] loading -> Observable<Int> in

        if (loading || self.pageStatus != true || self.netStatus != true) {

            return Observable.empty()

        }
        else
        {

            return Observable<Int>.create
                { [unowned self] observer in

                    print("self.pageIndex called",self.offset)

                    self.offset += 20

                    observer.onNext(self.offset)

                    observer.onCompleted()

                    return Disposables.create()

            }

        }

}

при возврате obervable.empty () он завершает Observable.

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Проблема, с которой вы столкнулись, не имеет никакого отношения к опубликованному вами коду.flatMap не позволит событию .completed избежать его, и это все, что выдает конструктор empty().

Другими словами, возврат .empty() - это , а не причина, по которой ваша наблюдаемая завершается.

0 голосов
/ 09 октября 2018

Вы можете просто не возвращать наблюдаемое в этой ситуации:

let nextPageRequest = loading.asObservable()

    .sample(loadNextPageTrigger)

    .flatMap { [unowned self] loading -> Observable<Int> in 

            return Observable<Int>.create { [unowned self] observer in

                    print("self.pageIndex called",self.offset)

                    self.offset += 20

                    observer.onNext(self.offset)

                    observer.onCompleted()

                    return Disposables.create()

            }


}

Также, если вам нужен статус этого выражения, вы также можете передать его:

let nextPageRequest = loading.asObservable ()

    .sample(loadNextPageTrigger)

    .flatMap { [unowned self] loading -> Observable<(Bool, Int)> in 

            return Observable<(Bool, Int)>.create { [unowned self] observer in

                    print("self.pageIndex called",self.offset)

                    self.offset += 20

                    let status = loading || self.pageStatus != true || self.netStatus != true

                    observer.onNext(status, self.offset)

                    observer.onCompleted()

                    return Disposables.create()

            }


}
0 голосов
/ 09 октября 2018
  1. Переменная устарела согласно RxSwift v4.x
  2. Когда что-то неожиданно завершается в iOS, обычно это происходит потому, что оно освобождается.Если вы используете DI, такой как Swinject, объявите класс, содержащий вашу наблюдаемую область контейнера: «container.register (MyClass.self) {_ in MyClass ()} .inObjectScope (.container) '
0 голосов
/ 09 октября 2018

Вы должны управлять своим кодом, используя singleton. Это сохраняет наблюдаемый, который будет жить во всем приложении.использовать синглтон класса

...