如何从 RxSwift 中的 onNext 获得正确的值?

Posted

技术标签:

【中文标题】如何从 RxSwift 中的 onNext 获得正确的值?【英文标题】:How do I get the correct value from onNext in RxSwift? 【发布时间】:2019-12-20 10:06:35 【问题描述】:

我有来自URLparsed 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.namearrayData.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 我知道了并编辑了我的答案。添加了 CustomStringConvertibledescription 属性,您可以在其中添加自己的实例文本表示。 啊,好的,CustomStringConvertible 为我做了。它适用于JSONJSONDecoder,因此缺少转换。谢谢你启发我! :)【参考方案2】:

myArray.value 是 [People] 的数组,不允许直接访问 people 属性(姓名、工作)。您必须从特定索引中获取人员,然后才能访问人员的属性。

【讨论】:

以上是关于如何从 RxSwift 中的 onNext 获得正确的值?的主要内容,如果未能解决你的问题,请参考以下文章

Rx Swift 丢弃 .do(onNext: ) 我如何让它触发?

RxSwift 调用 bind 立即触发 vs subscribe(onNext: )

调用 .onNext(newArray) 时 RXSwift collectionView 不更新

如何获得正斜杠网址? [重复]

如何在 RxSwift 中延迟从 Collection 中逐一发出项目

rxSwift 中的 observable 和 subject 有啥区别