首页 > 解决方案 > 将 JSON 响应分配给模型 SwiftUI

问题描述

我通过创建模型成功解析了 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.all = result.allself = result同样的错误。

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

PeopleListVM.swift

import SwiftUI

class PeopleListVM: ObservableObject {

 let people = PeopleListVM.createModel()

 static func createModel() {
    PeopleListM()
 }
}

标签: iosmvvmswiftuialamofire

解决方案


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,因为网络总是伴随着状态变化,而值类型意味着是不可变的。


推荐阅读