无法将 [Employees] 类型的值分配给类型"PublishSubject<[Employees]>



我已经使用URLSession成功parsedjson数据,现在我想将parsed数据添加到array中。使用普通array执行此操作可以正常工作,但我正在学习Rx,因此想使用subject.

所以,这有效:

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

但这给出了一个错误:

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

无法将类型"[员工]"的值分配给类型"发布主题<[员工]>

这是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()
}

有人知道如何做到这一点以及为什么首先会出现错误?<>不是简单地指出应该observed哪个type吗?也没有.accept()工作。

编辑

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

这奏效了,但是什么相当于BehaviorSubjectPublishSubjuct

错误消息非常明确:您存在类型不匹配。例如,如果您尝试将字符串分配给 Int 变量,则会收到相同的错误消息。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)
}

每次通过PublishSubject发送数组时,都会触发上面的next块,如下所示:

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

从您的编辑中,您似乎继续尝试使用BehaviorRelay。我建议在决定哪个适合您的用例之前阅读这两个类之间的差异。在尝试了解不同类型的主题和中继之间的区别时,这篇文章对我真的很有帮助:https://medium.com/@dimitriskalaitzidis/rxswift-subjects-a2c9ff32a185

祝你好运!

试试

self.parsedJSON.onNext(decodedJson.people)

相关内容

  • 没有找到相关文章

最新更新