Ios 使用Decodable-Swift 5链接多个JSON请求

Ios 使用Decodable-Swift 5链接多个JSON请求,ios,json,swift,iphone,Ios,Json,Swift,Iphone,我的“url”对象有一个链接,该链接捕获用户在搜索栏中键入的内容,以完成链接,然后开始JSON过程。JSON完成解析后,第一个链接用另一个链接响应。在my中,如果让validLink=result.link,您会看到我将链接信息存储到一个数组中。现在我不确定是否应该在我的中开始另一个JSON响应,如果让validLink=result,或者是否应该创建一个新函数,就像我在下面的代码中尝试做的那样,基本上复制并粘贴下面相同的JSON信息来重新分析它。第二个链接出现解析错误。最有效和正确的方法是什么

我的“
url
”对象有一个链接,该链接捕获用户在搜索栏中键入的内容,以完成链接,然后开始JSON过程。JSON完成解析后,第一个链接用另一个链接响应。在my
中,如果让validLink=result.link,您会看到我将链接信息存储到一个数组中。现在我不确定是否应该在我的
中开始另一个JSON响应,如果让validLink=result
,或者是否应该创建一个新函数,就像我在下面的代码中尝试做的那样,基本上复制并粘贴下面相同的JSON信息来重新分析它。第二个链接出现解析错误。最有效和正确的方法是什么?我真的被困在这里了

我尝试创建另一个函数,该函数使用第一个JSON解析中的信息使用新链接再次重新分析

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder()

    if let searchText = searchController.searchBar.text, !searchText.isEmpty {
        let url = URL(string: "http://djp-dev/api/item?q=\(String(describing: searchText))&dev=1")
        let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
                guard let data = data,
                    error == nil else {
                        print(error?.localizedDescription ?? "Response Error")
                        return }

                do {
                    let jsonResult = try JSONDecoder().decode(Response.self, from: data)
                    let resultsArray = jsonResult.results

                    for result in resultsArray {
                        if let validLink = result.link {
                            print(validLink)
                            self.collectLink.append(validLink)
                            self.mainParse()
                        }
                    }

                } catch {
                    print("Parse Error")
            }
        }
         task.resume()
    }
}

func mainParse() {
   let url = URL(string: "http://djp-dev\(collectLink[0])?dev=1")
    print(url!)
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
        guard let data = data,
            error == nil else {
                //print(error?.localizedDescription ?? "Response Error")
                return }

            do {
                let jsonResult = try JSONDecoder().decode(JSONResponse.self, from: data)
                let mainArray = jsonResult.locations

                for main in mainArray {
                   print("""
                        Manufacture = \(main.rid)
                        Description = \(main.description)
                        """)
                        /*if let validLink = result.description! {
                        }*/
                    }

                } catch {
                    print("Parse Error")
            }
        }
            task.resume()

    DispatchQueue.main.async {
            self.tableView.reloadData()
    }

}

我基本上是问
http://djp-dev/api/item?q=\(String(description:searchText))&dev=1
,用于返回给我的响应中的链接。我希望使用它发送给我的链接来启动另一个JSON请求。我不确定是应该将所有内容保存在一个请求中,还是使用一个全新的JSON请求创建一个全新的函数<代码>如果让validLink=result.link{}
是在我收到第二个链接信息时。

所以我已经找到了答案。我用的是不带密码的可解码钥匙。感谢瓦迪安为我指明了正确的方向。下面是我的例子:

struct Response : Decodable {
    let results: [Results]

    enum CodingKeys: String, CodingKey {
        case results = "photos"
    }
}

struct Results : Decodable {
    let url : String?

    enum CodingKeys: String, CodingKey {
        case url = "url"
    }
}

@vadian的意思是,
Codable
aut神奇地使用变量名作为编码键。因此,您可以简单地添加
可解码的
,如:

struct响应:可解码{
让结果:[结果]
私有枚举编码键:字符串,编码键{
案例结果=“照片”
}
}
结构结果:可解码{
让url:String?
}
如果您将
结果
的名称更改为
照片
,您可以这样做

struct响应:可解码{
让我们看看照片:[结果]
}
结构结果:可解码{
让url:String?
}

相反,如果需要对数据进行后处理,例如,将
字符串
转换为
日期
,则需要自己实现
init(来自解码器:解码)抛出
。我强烈建议您阅读。

如果您有一个json示例,那么有许多免费的在线工具可用于创建具有可编码协议的自定义swift结构/类


一个这样的例子是

为了使其可重用,您可以创建一个separte函数,使请求通过url字符串或url作为参数,但在请求内部执行另一个请求没有问题,您必须检查保留周期,并查看、、等错误。使用“承诺”(或“未来”)!@kjoe你想到一个例子了吗?我试着在请求中这样做,但似乎第二个请求弄乱了第一个请求。@JayLee我从来没有真正参与过在我的代码中添加额外的框架。我需要所有四个框架,或者PromiseKit都可以正常工作,对吗?你如何使用PromiseKit?@Dewan你可以选择一个适合我的框架你的需求,在看了文档之后。PromiseKit是成熟的,在许多项目中都有使用,并且承诺来自Google。如果这个问题是你项目中唯一的嵌套API调用,我不会添加依赖项来解决这个问题。但是,如果这个模式在你的API调用中很常见,那么使用其中一个库可以让你的生活更轻松第二个结构你可以省略编码键,如果你给数组命名
photos
你也可以省略第一个结构中的编码键。终于有时间看了,我很高兴看到你找到了答案!@JayLee是的,先生,我仍然非常感谢你抽出时间帮我看这个问题。我还没有编程我在几年前就开始学习了,有点生疏,但现在真的开始学习了。谢谢man@vadian你是什么意思?我可以让代码更干净?你是什么意思?@Dewan是的,没错。