Вы не приводите наблюдаемый объект к типу, вы подписываетесь на события этого наблюдаемого объекта.
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.
ОБНОВЛЕНИЕ:
Я не эксперт в 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()
}
}
}
Итак, обратите внимание, что само наблюдаемое не изменилось. Теперь, когда я подписываюсь на наблюдаемое, я затем использую flatMap для преобразования входящих данных в Observable типа Observable.
Как я объяснил мне это так: в мире Rx .map ожидает, что вы вернете тот же тип, который ему передан, но flatMap можно использовать для преобразования элемента во что-то еще. может кто-нибудь прояснить это или объяснить более подробно?
Итак, надеюсь ответить на ваш вопрос ... Вы можете отобразить наблюдаемое, чтобы выполнять преобразования с помощью flatMap, а затем подписаться на новый наблюдаемый объект, который даст вам ваше преобразованное значение.
Надеюсь это поможет
person
Scriptable
schedule
13.06.2017
item
равноObservable<Data>
, аModel
ожидает<Data>
. - person Jonatan   schedule 13.06.2017.map
. - person Jonatan   schedule 13.06.2017