2017-06-13 76 views
0

如何投射Observable<Data>Data?即獲得可觀察值的值。無法將類型'Observable <Data>'的值轉換爲預期參數類型'數據'

Data.rx_subscribeData() 
    .map({ data -> [Model] in 
     return data.enumerated().map({ (index, item) in 
     return Model(data: item) 
     }) 
    }) 
    .bindTo(tableView.rx.items(dataSource: dataSource)) 
    .addDisposableTo(disposeBag) 
+0

請出示一些代碼,什麼錯誤你得到 – Scriptable

+0

更新與示例代碼。 'item'是'Observable ''而'Model'預計''。 – Jonatan

+0

您在哪一點訂閱? – Scriptable

回答

0

您不會將某個observable轉換爲某個類型,而是訂閱該observables事件。

func observeSomeData() -> Observable<Data> { 
    // some rx magic 
    return Observable.create { observer in 
     let string = "Hello World" 
     let data = string.data(using: String.Encoding.utf8) 

     observer.on(.next(data)) 
     observer.on(.completed) 
     return Disposables.create() 
    } 
} 

您現在訂閱此可觀察事件並對其事件作出響應。你可以用很多方法來做到這一點,我更喜歡更加詳細的方式。

_ = observeSomeData.subscribe() { event in 
    switch event { 
     case .next(let data): 
      // here you have data. 
     case .error(let error): 
      // an error occurred 
     case .completed: 
      // the observable has finished sending events. 
    } 
} 

上有RxSwift GitHub的頁面上Getting Started文檔的詳細信息。

UPDATE:

我在RxSwift專家,但我相信我已經成功地得到它的工作。

這裏是我在測試項目中使用的代碼的第一個版本。

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     _ = getData().subscribe() { event in 
      switch event { 
      case .next(let data): 
       let str = String(data: data, encoding: String.Encoding.utf8) 
       print("Received string data: \(String(describing: str))") 
      case .completed: 
       print("completed") 
      case .error(let error): 
       print("error occurred: \(error)") 
      } 
     } 
    } 

    func getData() -> Observable<Data> { 

     return Observable.create { observer in 
      let data = "Hello World".data(using: String.Encoding.utf8)! 
      observer.on(.next(data)) 
      observer.on(.completed) 
      return Disposables.create() 
     } 
    } 
} 

所以這段代碼只是創建了一個Observable類型的observable,它只是發出一個包含一些數據的事件。這可以正常工作,但不會像您希望的那樣轉換數據。

我的代碼的第二個版本..

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     _ = getData().flatMap({ (data: Data) -> Observable<String> in 
      return Observable.just(String(data: data, encoding: String.Encoding.utf8)!) 
     }).subscribe() { event in 
      switch event { 
      case .next(let str): 
       print("Received string data: \(String(describing: str))") 
      case .completed: 
       print("completed") 
      case .error(let error): 
       print("error occurred: \(error)") 
      } 
     } 
    } 

    func getData() -> Observable<Data> { 

     return Observable.create { observer in 
      let data = "Hello World".data(using: String.Encoding.utf8)! 
      observer.on(.next(data)) 
      observer.on(.completed) 
      return Disposables.create() 
     } 
    } 
} 

所以在這裏,注意觀察的本身是不變的。現在,當我訂閱observable時,我使用flatMap將傳入的數據轉換爲Observable類型的Observable。

正如我對此向我解釋的那樣:在Rx世界中,.map期望您返回傳入其中的相同的類型,但可以使用flatMap將元素轉換爲其他類型。 有人可以澄清這一點或解釋更詳細?

所以,希望能夠回答你的問題。你可以映射到observable上,使用flatMap進行轉換,然後訂閱新的observable,它將給你轉換後的值。

希望這有助於

+0

我應該在我的'.map'函數中訂閱嗎?我沒有完全理解它。 – Jonatan

+0

讓我試着舉一個例子 – Scriptable

+0

我已經更新了我的答案,我希望它有幫助。我發現自己有點困惑。在你的代碼中你調用Data。 (這不會工作嗎?)然後映射到枚舉數據並傳遞給模型?我認爲這不會起作用。你能提供一個更具體的例子,我可以測試它嗎? – Scriptable

相關問題