2016-04-25 13 views
1

私はapi呼び出しのためのオブザーバブルを作成し、tableviewにバインドしました。今私は不明です同じAPIをもう一度呼び出す方法?リフレッシュを行うように - ボタンをクリックすると?以下は私のサンプルコードです。RXSwift - APIを呼び出す方法

それは簡単です、それが参考になっ

var items : Observable<[String]>? 
    func viewDidLoad(){ 

      items = fetchAllAnswers() 
      items.bindTo(....).addDisposableTo(bag) 
    } 
    func fetchAllAnswers() -> Observable<[String]>{ 
    let api = Observable.create { (obsever: AnyObserver<[String]>) -> Disposable in 
     let answers = API.allAnswers() 
        obsever.onNext(answers) 
        obsever.onCompleted() 
        return AnonymousDisposable{ 
         print("api dispose called") 
        } 
       } 
       return api 

      } 

    func onClickRefresh() 
    { 
    // how to call api here again? 


    // let items = fetchAllAnswers() 
    // items.bindTo(....).addDisposableTo(bag) 

    } 

答えて

2

になります私はあなたの考えをお聞かせください。

fetchAllAnswers() 
.subscribeNext { stringArray in 
    items.value = stringArray 
} 
.addDisposableTo(bag) 
:あなたがかもしれ

items.asObservable.bindTo(....).addDisposableTo(bag) 

次は、加入者にあなたの項目を更新する:

let items = Variable([String]()) 

次のあなたのUITableViewを持つアイテムをバインドするためにあなたがしなければならない:あなたの項目を更新するためにあなたは、変数を使用すること

ボタンをクリックしてテーブルを更新する場合は、次に行うことができます。

yourButton.rx_tap 
.flatMap { void -> Observable<[String]> in 
    return fetchAllAnswers() 
} 
.subscribeNext { stringArray in 
    items.value = stringArray 
} 
.addDisposableTo(bag) 
+0

私はすでにテーブルビューにバインドして.bindTo()を使用してデータを生成しています。私はそれをもう一度結びつけなければならないということですか?コードを参照してください。私はちょうど再びデータがテーブルビューで再生成されることを望んで、再びAPIを呼びたいと思う –

+0

私は私の答えを更新しました。あなたの場合、私は変数を使用することを好む、あなたはそれを使用しようとすることはできますか? – Svyatoslav

+0

試してみましょう –

1
func viewDidLoad() { 
    button.rx_tap.startWith().flatMap { _ in 
    fetchAllAnswers() 
    }.bindTo(...).addDisposableTo(bag) 
} 

flatMapは、観察可能な結果のタップに変換します(ここではStringの配列)。

startWith()は、最初のリフレッシュ動作が維持されるように、サブスクリプション時にrx_tapに最初の値を出力させます。

関連する問題