Swift 5: JSON 来自 Alamofiire
Swift 5: JSON from Alamofiire
我有一个 class,其中包含一些 Alamofire 代码,用于从服务器获取 JSON,将其转换为预定义模型,然后 return 该模型作为数组。
这是代码
func GetLights(completionHandler: @escaping (DataResponse<[LightList]>) -> Void) -> Alamofire.DataRequest {
return AF.request(APIString + "/lights").responseJSON { response in
let LightListResponse = response.flatMap { json in
try JSONDecoder().decode([LightList].self, from: response.data!)
}
completionHandler(LightListResponse)
}
}
func GetLightList() {
GetLights { response in
if let lights = response.value {
print(lights)
}
}
}
我可以断点到 JSON 解码器并通过调试查看 json 但最后的打印行什么也没打印,它甚至没有遇到断点。
谁能看出我做错了什么?我认为我正确使用了完成处理程序?
我正在通过 SwiftUI 文件调用 GetLightList,如下所示:
func InitList() {
let requests = Requests()
requests.GetLightList()
}
您不应该使用 responseJSON
执行此操作,因为该方法已经使用 JSONSerialization
解析了 JSON 并将其作为响应的一部分提供给您。相反,您应该使用 responseDecodable
,因为您已经有了 Decodable
类型。
return AF.request(apiString + "/lights").responseDecodable(of: [LightList].self) { response in
completionHandler(response)
}
但是,通常最好不要公开 Alamofire 生成的 DataResponse
类型,而是使用完成处理程序中的响应中的 Result
。
此外,更新您的样式以匹配 Swift 推荐的样式将帮助您编写一致的代码。即,方法和变量名称应以小写字母开头,以将它们与类型声明分开。您可以在代码示例中看到这一点,它认为 "APIString" 之类的东西是类型而不是变量。
最后,不要将 get
作为方法前缀重载通常很有帮助。对于网络调用,我喜欢在请求资源时使用 fetch
。例如fetchLights
.
我有一个 class,其中包含一些 Alamofire 代码,用于从服务器获取 JSON,将其转换为预定义模型,然后 return 该模型作为数组。
这是代码
func GetLights(completionHandler: @escaping (DataResponse<[LightList]>) -> Void) -> Alamofire.DataRequest {
return AF.request(APIString + "/lights").responseJSON { response in
let LightListResponse = response.flatMap { json in
try JSONDecoder().decode([LightList].self, from: response.data!)
}
completionHandler(LightListResponse)
}
}
func GetLightList() {
GetLights { response in
if let lights = response.value {
print(lights)
}
}
}
我可以断点到 JSON 解码器并通过调试查看 json 但最后的打印行什么也没打印,它甚至没有遇到断点。
谁能看出我做错了什么?我认为我正确使用了完成处理程序?
我正在通过 SwiftUI 文件调用 GetLightList,如下所示:
func InitList() {
let requests = Requests()
requests.GetLightList()
}
您不应该使用 responseJSON
执行此操作,因为该方法已经使用 JSONSerialization
解析了 JSON 并将其作为响应的一部分提供给您。相反,您应该使用 responseDecodable
,因为您已经有了 Decodable
类型。
return AF.request(apiString + "/lights").responseDecodable(of: [LightList].self) { response in
completionHandler(response)
}
但是,通常最好不要公开 Alamofire 生成的 DataResponse
类型,而是使用完成处理程序中的响应中的 Result
。
此外,更新您的样式以匹配 Swift 推荐的样式将帮助您编写一致的代码。即,方法和变量名称应以小写字母开头,以将它们与类型声明分开。您可以在代码示例中看到这一点,它认为 "APIString" 之类的东西是类型而不是变量。
最后,不要将 get
作为方法前缀重载通常很有帮助。对于网络调用,我喜欢在请求资源时使用 fetch
。例如fetchLights
.