将 JSON 响应分配给模型 SwiftUI

Posted

技术标签:

【中文标题】将 JSON 响应分配给模型 SwiftUI【英文标题】:Assign JSON Response to Model SwiftUI 【发布时间】:2020-07-06 07:08:55 【问题描述】:

我已通过创建模型成功解析 JSON。但现在我想要一个视图模型,它与视图对话,并且视图在模型更新时更新。但是我很难初始化模型。

我的简化模型如下所示。

PeopleListM.swift

import SwiftUI
import Alamofire

struct PeopleListM: Decodable 
var all: [Person]

enum CodingKeys: String, CodingKey 
    case all = "people"


struct Person: Decodable 
    
    let name: String
    let email: String
    let favorite: Bool
    let lastSent: String?

    
    enum CodingKeys: String, CodingKey 
        case name
        case email = "email_id"
        case favorite
        case lastSent = "last_sent"
    



init() 
    let headers: HTTPHeaders = ["disableauth" : "true", "Content-Type": "application/json"]
      AF.request("MY URL", parameters: nil, headers: headers)
        .validate()
        .responseDecodable(of: PeopleListM.self)  (response) in
            guard let result = response.value else  return 
            self.all = result.all
        

这段代码给了我错误Escaping closure captures mutating 'self' parameter 我尝试用self = result 更改行self.all = result.all,同样的错误。

我的进一步计划是创建一个符合ObservableObject的类

PeopleListVM.swift

import SwiftUI

class PeopleListVM: ObservableObject 

 let people = PeopleListVM.createModel()

 static func createModel() 
    PeopleListM()
 

【问题讨论】:

【参考方案1】:
final class PeopleListVM: ObservableObject 

    @Published var people = PeopleListVM.createModel()

    static func createModel() 
        PeopleListM()
    
    
    func request() 
        // networking here...
        // update people in callback
        // ... self.people = newPeople
    


struct Model: View 
    @ObservableObject var vm = PeopleListVM()   
    // ...

您通常不会将网络代码放在struct 中,因为网络总是伴随着状态变化,而值类型是不可变的。

【讨论】:

但是如何将来自 API 的人员分配给模型中的人员? responseDecodable(of: PeopleListM.self) 解码为PeopleListM,将其分配给self.people。这个 AF.request 代码应该发生在 PeopleListVM 中,这是一个引用类型,所以你没有mutating self 问题。

以上是关于将 JSON 响应分配给模型 SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

将 Ajax 响应分配给 php 变量

在将查询响应分配给模型字段时丢失大量的ember-data类属性

如何将从webapi返回的自定义对象数组的HttpResponse响应分配给打字稿角度中相同数组类型的对象?

使用 JSON 响应快速调用函数时出错

lumen 6:如何在 lumen 上重构响应分页的数据?

如何访问 data.d.results 上的这些数据