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.