Невозможно присвоить значение типа [Сотрудники] типу 'PublishSubject <[Сотрудники]> - PullRequest
0 голосов
/ 15 января 2020

Я успешно parsed json данных использую URLSession, и теперь я хочу добавить данные parsed в array. Выполнение этого с использованием обычного array работает нормально, но я изучаю Rx и поэтому хочу использовать subject.

Итак, это работает:

var parsedJson = [Employees]()
self.parsedJson = decodedJson.people

Но это выдает ошибку:

var parsedJson: PublishSubject<[Employees]> = PublishSubject<[Employees]>()
self.parsedJson = decodedJson.people

Невозможно присвоить типу значение '[Employees]' для типа 'PublishSubject <[Employees]>'

Вот код URLSession:

//    var parsedJson = [Employees]()
    var parsedJson: PublishSubject<[Employees]> = PublishSubject<[Employees]>()


    func getJSON(completion: @escaping () -> Void) {
        guard let url = URL(string:"https://api.myjson.com/bins/jmos6") else { return }

        URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data else { return }

            do {
                let jsonDecoder = JSONDecoder()
                jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
                jsonDecoder.dateDecodingStrategy = .iso8601

                let decodedJson = try jsonDecoder.decode(People.self, from: data)
                self.parsedJson = decodedJson.people
                completion()
            } catch {
                print(error)
            }
        }.resume()
    }

Кто-нибудь знает, как это сделать и почему в первую очередь возникает ошибка ? Разве <> просто не указывает, какой type должен быть observed? Не удалось заставить .accept() работать.

РЕДАКТИРОВАТЬ

let parsedJson: BehaviorRelay<[Employees]> = BehaviorRelay(value: [])
self.parsedJson.accept(decodedJson.people)

Это сработало, но что эквивалентно BehaviorSubject и PublishSubjuct?

Ответы [ 2 ]

1 голос
/ 15 января 2020

Сообщение об ошибке довольно ясно: у вас есть несоответствие типов. Вы получите то же сообщение об ошибке, если попытаетесь присвоить строку, например, переменной Int. A PublishSubject не является массивом. Это механизм (воспринимается как конвейер) для отправки потока значений определенных типов (в данном случае массив сотрудников).

Обычно вы используете темы, подписываясь на них так:

var parsedJson = PublishSubject<[Employee]>()
// the 'next' block will fire every time an array of employees is sent through the pipeline
parsedJson.next { [weak self] employees in
    print(employees)
}

Приведенный выше блок next будет срабатывать каждый раз, когда вы отправляете массив через PublishSubject следующим образом:

let decodedJson = try jsonDecoder.decode(People.self, from: data)
self.parsedJson.onNext(decodedJson.people)

Из вашей правки кажется, что вы перешли к попытке использовать BehaviorRelay. Я бы порекомендовал прочитать различия между этими двумя классами, прежде чем решить, что подходит для вашего варианта использования. Эта статья была очень полезна для меня, когда я пытался понять различия между различными типами предметов и реле: https://medium.com/@dimitriskalaitzidis / rxswift-subject-a2c9ff32a185

Удачи!

1 голос
/ 15 января 2020

Попробуйте

self.parsedJSON.onNext(decodedJson.people)
...