无法将'Observable <data>'类型的值转换为预期的参数类型'Data'

时间:2017-06-13 12:48:14

标签: swift rx-swift

如何将Observable<Data>投射到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)

1 个答案:

答案 0 :(得分: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文档的更多信息。

<强>更新

我不是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可以用来将元素转换成某个东西其他。 有人可以澄清一下或更详细地解释一下吗?

所以,希望能回答你的问题..你可以使用flatMap映射on observable进行转换,然后订阅新的observable,它将为你提供转换后的值。

希望这有帮助