我已经使用URLSession
成功parsed
json
数据,现在我想将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)
这奏效了,但是什么相当于BehaviorSubject
和PublishSubjuct
?
错误消息非常明确:您存在类型不匹配。例如,如果您尝试将字符串分配给 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)