2016-04-25 64 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

這很簡單。您可以使用變量進行更新項目:

let items = Variable([String]()) 

接下來你一定要綁定您的UITableView項目:

fetchAllAnswers() 
.subscribeNext { stringArray in 
    items.value = stringArray 
} 
.addDisposableTo(bag) 

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

接下來,您可以在用戶更新項目

如果你想通過點擊按鈕來更新你的桌子,你可以做下一步:

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

我已經將它綁定到tableview來使用.bindTo()填充。這是否意味着我必須再次綁定它?請參閱代碼。我只想再次調用API,希望數據能夠在tableview中重新填充 –

+0

我更新了我的答案。在你的情況下,我更喜歡使用變量,你可以嘗試使用它嗎? – Svyatoslav

+0

會嘗試讓你知道 –

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

flatMap將轉換爲閉包返回的可觀察結果,這裏是一個String數組。

startWith()將強制rx_tap在訂閱時發出第一個值,以保持第一個刷新行爲。