【问题标题】:RxSwift reload tableviewRxSwift 重新加载表格视图
【发布时间】:2018-04-12 08:59:39
【问题描述】:
let officialAccountObservable : Observable<[SearchUser]> = SearchAPI.sharedAPI.suggestAccounts()

        officialAccountObservable.bind(to: tableView.rx.items(cellIdentifier: "followcell", cellType: FollowCell.self)) {
            (index, user , cell) in
            if user.profileImagePath.isEmpty == false {
                cell.profile.af_setImage(withURL: URL.init(string: user.profileImagePath)!)
            }else {
                cell.profile.image = UIImage.init(named: "icon_user_03")
            }
            cell.nickName.text = user.nickName

            cell.follow.rx.tap
                .debounce(0.3, scheduler: MainScheduler.instance)
                .subscribe(onNext: {
                    [unowned self] in
                    cell.setFollow(user: user, completion: { (result) in
                        if(result == true){

                        }
                    })
                }).addDisposableTo(self.disposeBag)
        }.addDisposableTo(disposeBag)

func suggestAccounts() -> Observable<[SearchUser]> {

    let uri = Constants.VyrlSearchURL.suggestUsers

    return Observable.create { observer in
        let request = Alamofire.request(uri, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: Constants.VyrlAPIConstants.getHeader()).responseArray { (response: DataResponse<[SearchUser]>) in
            let value = response.result.value

            observer.onNext(value!)
            observer.onCompleted()
        }

        return Disposables.create(with: request.cancel)
    }
}

我想在代码中重新加载表格视图(结果 == true) 要重新加载,必须收到 OfficialAccountObservable。 我的代码已经结束了,我想知道如何在这种状态下更新它。

【问题讨论】:

标签: ios swift uitableview rx-swift


【解决方案1】:

我认为您现在遇到的问题是,当您创建进行 Alamofire 调用的 observable 时,它​​只会执行一次,因为您无法进行另一个调用。

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

主题既是输入,也是输出。在您的情况下,输出将是您的表格视图的数据,您可以像以前那样绑定它。

然后,使用拉动刷新或其他适合的重新加载机制进行 Web 服务调用并将结果发布到主题(然后将更新您的表格视图)。

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

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

你应该检查一下。尤其是 RxSwift for Dummies 非常适合基本了解事物应该如何工作。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是一个不错的答案!
    【解决方案3】:

    我建议你创建一个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())
    

    并在需要刷新时调用刷新:

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

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多