RxSwift重载tableview

时间:2017-10-31 08:49:22

标签: ios swift uitableview rx-swift

git clone

我想在代码中重新加载表视图(result == true) 对于重新加载,必须收到OfficialAccountObservable。 我的代码全部结束,我想知道如何在该状态下更新它。

3 个答案:

答案 0 :(得分:3)

AFAIK,这是执行此操作的标准方式 -

let source = PublishSubject<Observable<[SearchUser]>>()
let officialAccountObservable: Observable<[SearchUser]> = source.switchLatest()
source.onNext(suggestAccounts()) // every call will refresh your table

答案 1 :(得分:0)

我建议您创建一个Refreshable装饰器。

class Refreshable<T>: ObservableType {

    typealias E = T
    func subscribe<O:ObserverType>(_ observer: O) -> Disposable where O.E == E {
        return refreshMeans
            .flatMapLatest{ [unowned self] in
                return self.origin.asObservable()
            }
            .subscribe(observer)
    }

    private let disposeBag = DisposeBag()
    private let origin: Observable<T>
    init(origin: Observable<T>, updatedOn: Observable<Void> = .never()) {
        self.origin = origin
        updatedOn.bind(to: refreshMeans).disposed(by: disposeBag)
    }

    private let refreshMeans = BehaviorSubject<Void>(value: ())

    func refresh() {
        refreshMeans.on(.next())
    }

}

officialAccountObservable打包成Refreshable

let officialAccountObservable : Refreshable<[SearchUser]> = Refreshable(origin: SearchAPI.sharedAPI.suggestAccounts())

并在需要刷新时调用refresh:

if(result == true){
    officialAccountObservable.refresh()
}

答案 2 :(得分:0)

我认为你现在遇到的问题是当你创建一个进行Alamofire调用的observable时,它只会被执行一次,因为你无法再打一次电话。

您可能想要做的事情就像Maxim Volgin建议的那样:使用主题。

主题同时是输入和输出。在您的情况下,输出将是您的tableview的数据,您将像现在一样绑定它。

然后,使用pull刷新或其他适合重新加载的机制来进行Web服务调用并将结果发布给主题(然后将更新您的tableview)。

请记住,主题还会将onError和onComplete调用填充到观察者,因此请确保在将结果发布到主题之前处理Web服务调用中的可能错误。

我发现这个网站对于更好地理解RxSwift非常有帮助:http://swiftpearls.com/

你应该检查一下。特别是RxSwift for Dummies非常适合对事物的运作方式有基本的了解。