Невозможно преобразовать значение типа Observable ‹Data› в ожидаемый тип аргумента Data.

Как преобразовать 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)

person Jonatan    schedule 13.06.2017    source источник
comment
пожалуйста, покажите код и какую ошибку вы получаете   -  person Scriptable    schedule 13.06.2017
comment
Обновите образец кода. item равно Observable<Data>, а Model ожидает <Data>.   -  person Jonatan    schedule 13.06.2017
comment
в какой момент вы подписываетесь на это?   -  person Scriptable    schedule 13.06.2017
comment
Прямо перед .map.   -  person Jonatan    schedule 13.06.2017


Ответы (1)


Вы не приводите наблюдаемый объект к типу, вы подписываетесь на события этого наблюдаемого объекта.

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
comment
Должен ли я подписаться внутри моей .map функции? Я не совсем понимаю это. - person Jonatan; 13.06.2017
comment
позвольте мне привести пример - person Scriptable; 13.06.2017
comment
Я обновил свой ответ, надеюсь, это поможет. Я сам себя немного запутал. в вашем коде вы вызываете Data. (что не сработает, не так ли?), а затем сопоставить перечисленные данные и передать их модели? Не думаю, что это сработает. Вы можете привести более конкретный пример, и я смогу его протестировать? - person Scriptable; 13.06.2017