【问题标题】:Assign JSON Response to Model SwiftUI将 JSON 响应分配给模型 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()
 }
}

【问题讨论】:

    标签: ios mvvm swiftui alamofire


    【解决方案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 问题。
    猜你喜欢
    • 2020-06-26
    • 2020-05-05
    • 1970-01-01
    • 2020-05-19
    • 2019-10-11
    • 2020-05-06
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    相关资源
    最近更新 更多