gpt4 book ai didi

swift - 无法将类型 'Observable' 的值转换为预期参数类型 'Data'

转载 作者:行者123 更新时间:2023-11-30 12:23:23 26 4
gpt4 key购买 nike

如何转换 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)

最佳答案

您不会将可观察量转换为类型,而是订阅该可观察量事件。

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.
}
}

有关 Getting Started 的更多信息RxSwift GitHub 页面上的文档。

更新:

我不是 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 类型的可观察对象,它只发出一个包含一些数据的事件。这可以工作,但不会按照您的意愿转换数据。

我拥有的代码的第二个版本..

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 映射可观察量以进行转换,然后订阅新的可观察量,这将为您提供转换后的值。

希望这有帮助

关于swift - 无法将类型 'Observable<Data>' 的值转换为预期参数类型 'Data',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44522025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com