URLSession не запускает второй GET - PullRequest
0 голосов
/ 08 октября 2019

Я не могу заставить свою вторую задачу "GET" работать.

Это бой для начинающих учиться Swift.

Я работаю с API "thetvdb", чтобы получитьинформация о серии и перечисление.
Информация об API: https://api.thetvdb.com/swagger

Первый шаг - войти в систему и получить токен с «POST» на https://api.thetvdb.com/login.

Далее«ПОЛУЧИТЬ» идентификатор нужной серии с помощью следующей функции:

    func GetSerieID(theSerieName: String){

        refreshToken() //Refresh the token before anything

        let theURL = "https://api.thetvdb.com/search/series?name=" + theSerieName
        let url = URL(string: theURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!

        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.setValue( "Bearer \(token)", forHTTPHeaderField: "Authorization") // the refreshed token

        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in

            if let data = data{
                // I use SwiftyJSON.swift to manage the JSON's
                let json = try? JSON(data: data)
                theJSONContent = json!["data"]

                // Manage the theJSONContent to get the ID

            }

            if let httpResponse = response as? HTTPURLResponse {
                print("httpResponse: " + String(httpResponse.statusCode) + " >>GetSerieID\n")
            }
        }
        task.resume()
    }

Функция GetSerieID работает по феномену, но следующая функция GetSerieData не устанавливает URLSession, она немедленно переходит к возврату!

    func GetSerieData(theSerieID: String) -> JSON {

        refreshToken() //Refresh the token before anything

        var theJSONContent = JSON()

        let theURL = "https://api.thetvdb.com/series/" + theSerieID + "/episodes"
        let url = URL(string: theURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!

        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.setValue( "Bearer \(token)", forHTTPHeaderField: "Authorization") // the refreshed token

        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in

            if let data = data{
                // I use SwiftyJSON.swift to manage the JSON's
                let json = try? JSON(data: data)
                theJSONContent = json!["data"]

            }

            if let httpResponse = response as? HTTPURLResponse {
                print("httpResponse: " + String(httpResponse.statusCode) + " >>GetSerieID\n")
            }
        }
        task.resume()

        return theJSONContent
    }

Следующий запрос:

Printing description of request:
▿ https://api.thetvdb.com/series/300472/episodes
  ▿ url : Optional<URL>
    ▿ some : https://api.thetvdb.com/series/300472/episodes
  - cachePolicy : 0
  - timeoutInterval : 60.0
  - mainDocumentURL : nil
  - networkServiceType : __ObjC.NSURLRequest.NetworkServiceType
  - allowsCellularAccess : true
  ▿ httpMethod : Optional<String>
    - some : "GET"
  ▿ allHTTPHeaderFields : Optional<Dictionary<String, String>>
    ▿ some : 3 elements
      ▿ 0 : 2 elements
        - key : "Accept"
        - value : "application/json"
      ▿ 1 : 2 elements
        - key : "Content-Type"
        - value : "application/json"
      ▿ 2 : 2 elements
        - key : "Authorization"
        - value : "Bearer eyJhbGciOiJSUzI1NiIsInR5tokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentoken"
  - httpBody : nil
  - httpBodyStream : nil
  - httpShouldHandleCookies : true
  - httpShouldUsePipelining : false

Обе функции для "GET" практически одинаковы, только URL-адрес изменяется. Это, конечно, что-то простое, но я застрял.

Если я переверну их и сначала вызову GetSerieData, а затем GetSerieID, то снова будет работать первый, но не второй.

ЭтоПонятно, что это проблема установления первого соединения с GET, которое не завершает сеанс или что-то еще, но я не могу найти, как с этим справиться. В какой-то версии кода я добавил «DELETE» только для того, чтобы попробовать, но он тоже не сработал.

Может кто-нибудь показать мне немного света?

С уважением

1 Ответ

1 голос
/ 08 октября 2019

Это потому, что эта задача асинхронная, и она немедленно возвращается. Вам необходимо добавить блок завершения.

func GetSerieData(theSerieID: String, completion: @escaping (JSON) -> Void) {

        refreshToken() //Refresh the token before anything

        var theJSONContent = JSON()

        let theURL = "https://api.thetvdb.com/series/" + theSerieID + "/episodes"
        let url = URL(string: theURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!

        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.setValue( "Bearer \(token)", forHTTPHeaderField: "Authorization") // the refreshed token

        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in

            if let data = data{
                // I use SwiftyJSON.swift to manage the JSON's
                let json = try? JSON(data: data)
                theJSONContent = json!["data"]
                completion(theJSONContent)
            }

            if let httpResponse = response as? HTTPURLResponse {
                print("httpResponse: " + String(httpResponse.statusCode) + " >>GetSerieID\n")
            }
        }
        task.resume()
    }

...