您不會將某個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,它將給你轉換後的值。
希望這有助於
請出示一些代碼,什麼錯誤你得到 – Scriptable
更新與示例代碼。 'item'是'Observable ''而'Model'預計''。 – Jonatan
您在哪一點訂閱? – Scriptable