Как я могу правильно вернуть функцию для формулировки с JSON? - PullRequest
0 голосов
/ 21 октября 2018

Недавно я запустил проект с использованием API 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()

1 Ответ

0 голосов
/ 21 октября 2018

Ваш код не может работать.

Вы должны разделить две задачи и использовать 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")
    }

}

Однако я рекомендую загружать (только) основные данные в контроллер основного вида и данные для выбранного местоположения по запросу в контроллер подробного просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...