将 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的主要内容,如果未能解决你的问题,请参考以下文章
在将查询响应分配给模型字段时丢失大量的ember-data类属性