2017-10-31 1 views
1
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を受信する必要があります。 私のコードはすべて終わっていて、私はその状態でどのように更新できるのでしょうか?RxSwiftリロードテーブルビュー

+0

https://stackoverflow.com/questions/42899259/reload-tableview-using-rxswift問題に関連していますか? –

答えて

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()) 
    } 

} 

あなたofficialAccountObservableRefreshableにラップ:、これはこれを行うための標準的な方法です

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

私の知る限りを -

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

を、あなたはそれを更新する必要があるときにリフレッシュを呼び出します

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

あなたが今問題を抱えていると思うのは、Alamofireの呼び出しを行うObservableを作成すると、別の呼び出しを行う方法がないため、Alamofireの呼び出しを一度だけ実行するということです。

あなたがしたいことは、Maxim Volginのようなものです:件名を使用してください。

被験者は入力と同時に出力されます。あなたのケースでは、出力はあなたのテーブルビューのためのデータとなり、あなたはすでにそれをバインドします。

次に、プルしてリロードするか、Webサービスコールを行い、結果をサブジェクトにパブリッシュするためのリロード用の別の適切なメカニズムを使用します(これによってテーブルビューが更新されます)。

また、被験者はonErrorとonCompleteをオブザーバーまで呼び出すので、結果を件名にパブリッシュする前にWebサービスコールで発生する可能性のあるエラーを処理するようにしてください。

私はRxSwiftのより良い理解を得るために、このサイトでは信じられないほど役に立った:http://swiftpearls.com/

あなたはそれをチェックアウトする必要があります。特にRxSwift for Dummiesは、物事がどのように働くのかを基本的に理解することができます。