首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用JSON正确返回一个短语的函数?

如何使用JSON正确返回一个短语的函数?
EN

Stack Overflow用户
提问于 2018-10-22 00:28:36
回答 1查看 64关注 0票数 0

最近,我开始了一个使用CityBikes应用编程接口的项目,它允许实时拥有世界上不同城市的自行车共享站点(https://api.citybik.es/v2/)的数据。作为第一步,我提取了各种链接来获取接收各种信息所需的数据。然后,我创建了一个函数extractStationData,该函数接受链接并将它们添加到“基本”链接,从而允许解析JSON和接收各种数据。我的问题出现在这一点上,因为我无法通过函数将之前获得的数据添加到链接中。我该怎么做呢?我必须用回车符改变函数吗?

代码如下:

    let networksURL = "https://api.citybik.es/v2/networks/"
    guard let dataURL = URL(string: networksURL) else {return}

    URLSession.shared.dataTask(with: dataURL) { (data, response, err) in

        guard let data = data else {return}
        let dataAsString = String(data: data, encoding: .utf8)

    guard let blog = try? JSONDecoder().decode(Blog.self, from: data) else {
        print("Error: Couldn't decode data")
        return
    }

    print("Networks link:")
    for article in blog.articles {
        print("- \(article.href)")
    }

        func extractStationData() {
            for article in blog.articles {
                article.href
            }
        }

        let stationDataURL = "https://api.citybik.es\(extractStationData())"
        guard let newDataURL = URL(string: stationDataURL) else {return}

        URLSession.shared.dataTask(with: newDataURL) { (data, response, err) in

            guard let data = data else {return}
            let dataAsStringForStation = String(data: data, encoding: .utf8)

            guard let dataFromStation = try? JSONDecoder().decode(Datamain.self, from: data) else {
                print("Error: Couldn't decode station data")
                return
            }

            print("data:")
            for something in dataFromStation.qwerty {
                print("- \(something.empty_slots)")
                print("- \(something.free_bikes)")
                print("- \(something.name)")
                print("- \(something.latitude)")
                print("- \(something.longitude)")

            }

            }.resume()
}.resume()
EN

回答 1

Stack Overflow用户

发布于 2018-10-22 00:48:42

你的代码不能工作。

您必须将这两个任务分开,并使用DispatchGroup在第二个任务中的网络请求完成时获得通知。

首先,使用完成处理程序为主任务创建一个函数,我省略了显示工作流的大部分代码

func getMainData(completion: @escaping(Blog)->Void) {

  ...
  URLSession.shared.dataTask(with: dataURL) { (data, response, err) in 
     ...
     completion(blog)
  }

}

调用函数并根据完成处理程序中的主要数据执行网络请求

getMainData() { blog in 
    let group = DispatchGroup()
    for article in blog.articles {
        ...
        group.enter()
        // create newDataURL from article
        URLSession.shared.dataTask(with: newDataURL) { (data, response, err) in
           ...
            for something in dataFromStation.qwerty {
               print("- \(something.empty_slots)")
               print(" .... "
            }
            group.leave()
        }

    }
    group.notify(queue: DispatchQueue.main) {
        print("finished")
    }

}

但是,我建议(仅)在主视图控制器中加载主数据,并在详细视图控制器中按需加载选定位置的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52917475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档