如何从 RxSwift 中的 onNext 获得正确的值?
Posted
技术标签:
【中文标题】如何从 RxSwift 中的 onNext 获得正确的值?【英文标题】:How do I get the correct value from onNext in RxSwift? 【发布时间】:2019-12-20 10:06:35 【问题描述】:我有来自URL
的parsed
JSON
数据和array
上的subscriber
触发器,因为array
被填充。但是我从onNext
得到的数据看起来像这样:MyProject.People
。如何获得实际值?这是我的代码:
guard let myURL = URL(string: "https://api.myjson.com/bins/e5gjk") else return
var myArray: Variable<[People]> = Variable([])
myArray.asObservable().subscribe(onNext: arrayData in
print("TRIGGERED", arrayData)
).disposed(by: bag)
Alamofire.request(myURL, method: .get)
.validate()
.responseJSON response in
guard response.result.isSuccess else
print("Error")
return
let json = JSON(response.result.value)
for i in 0...json["employees"].count
let people = People()
people.name = json["employees"][i]["firstName"].stringValue
people.job = json["employees"][i]["job"].stringValue
myArray.value.append(people)
for i in myArray.value
print(i.name)
print(i.job)
所以,arrayData
返回 MyProject.People
但应该给出字符串。我试过arrayData.name
和arrayData.value.name
但它没有显示任何东西。 People
看起来像这样:
class People
var name = ""
var job = ""
【问题讨论】:
你尝试调试了吗?看看你的json
结果?而且我相信这条线会崩溃,因为索引会超出范围for i in 0...json["employees"].count
如果我在填充了数组的 for 循环之后打印,我可以看到 myArray
中的所有数据,以便该部分工作。也不要撞车。但我认为你是对的,因为循环运行的时间比实际数据多一次,所以我会调查一下,谢谢!
【参考方案1】:
我会建议您使用Codable
协议而不是JSON
pod。
你可以在这里阅读更多关于Codable
的信息:https://www.swiftbysundell.com/basics/codable/
更多关于CustomStringConvertible
的信息在这里:
https://developer.apple.com/documentation/swift/customstringconvertible
这可以这么简单:
class Employees: Codable
let employees: [Employee]
/// If you want to print array with values
/// A textual representation of this instance.
extension Employees: CustomStringConvertible
var description: String
var text = ""
for employee in employees
text += "Employee first name: \(employee.firstName), Job: \(employee.job)\n"
return text
class Employee: Codable
let firstName: String
let job: String
我也尝试了简单的request
,它成功完成,我能够获取所有实体:(您可以将Alamofire响应从responseJSON
更改为responseData
)
let employees = try! JSONDecoder().decode(Employees.self, from: response.data)
print(employees)
...
Employee first name: Jocke, Job: developer
Employee first name: Anna, Job: construction
Employee first name: Peter, Job: pilot
【讨论】:
谢谢,但您认为您可以打印整个代码吗? :) 正如我在回答中所说,只需将.responseJSON
更改为.responseData
并将我的代码粘贴到您解码response data
到您的对象而不是符合Codable
我得到了解码部分的工作。我得到了预期的值。并触发rx
订阅者。但我仍然得到相同的打印:MyProject.People
。你在那里得到了正确的值吗?
@screenMonkeyMonkeyMan 我知道了并编辑了我的答案。添加了 CustomStringConvertible
和 description
属性,您可以在其中添加自己的实例文本表示。
啊,好的,CustomStringConvertible
为我做了。它适用于JSON
和JSONDecoder
,因此缺少转换。谢谢你启发我! :)【参考方案2】:
myArray.value 是 [People] 的数组,不允许直接访问 people 属性(姓名、工作)。您必须从特定索引中获取人员,然后才能访问人员的属性。
【讨论】:
以上是关于如何从 RxSwift 中的 onNext 获得正确的值?的主要内容,如果未能解决你的问题,请参考以下文章
Rx Swift 丢弃 .do(onNext: ) 我如何让它触发?
RxSwift 调用 bind 立即触发 vs subscribe(onNext: )
调用 .onNext(newArray) 时 RXSwift collectionView 不更新