Блок URLSession.shared.dataTask не работает - PullRequest
1 голос
/ 01 марта 2020

Я пытаюсь сделать запрос к API. Без обработчика завершения запрос выполняется без проблем. Однако теперь, когда я добавил обработчик завершения, блок URLSession.shared.dataTask, похоже, не запускается вообще; второе утверждение print никогда не печатает. Как мне настроить свой код для решения этой проблемы?

func makeRequestToApi(word: String, completionHandler: @escaping ([String]) -> Void) {
        var array = [String]()
        let appId = ""
        let appKey = ""
        let language = "en-us"
        let unwrappedURL = URL(string: "https://od-api.oxforddictionaries.com:443/api/v2/entries/\(language)/\(word)")!
        var request = URLRequest(url: unwrappedURL)
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.addValue(appId, forHTTPHeaderField: "app_id")
        request.addValue(appKey, forHTTPHeaderField: "app_key")
        print("THIS STATEMENT PRINTS...")
        let dataTask = URLSession.shared.dataTask(with: request) { (data, response, error) in
            print("AND THIS STATEMENT")
            if let data = data,
                let _ = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) {
                do {
                    let root = try JSONDecoder().decode(Root.self, from: data)
                    let results = root.results
                    for result in results {
                        for lexical in result.lexicalEntries {
                            for entry in lexical.entries {
                                for sense in entry.senses {
                                    for example in sense.examples {
                                        array.append(example.text)
                                    }
                                }
                            }
                        }
                    }
                } catch {
                    print(error)
                }
                completionHandler(array)
            }
        }
        dataTask.resume()
    }

Это функция, которую я использовал на другом контроллере представления, который возвращал данные для тех же слов:

func makeRequestToApi() {
        let appId = ""
        let appKey = ""
        let language = "en-us"
        let strictMatch = "false"
        var word = search
        word = word.lowercased()
        let oxDicURL = URL(string: "https://od-api.oxforddictionaries.com:443/api/v2/entries/\(language)/\(word)?strictMatch=\(strictMatch)")
        if let unwrappedURL = oxDicURL {
            var request = URLRequest(url: unwrappedURL)
            request.addValue("application/json", forHTTPHeaderField: "Accept")
            request.addValue(appId, forHTTPHeaderField: "app_id")
            request.addValue(appKey, forHTTPHeaderField: "app_key")
            let dataTask = URLSession.shared.dataTask(with: request) { (data, response, error) in
                if let data = data,
                    let _ = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) {
                    do {
                        let root = try JSONDecoder().decode(Root.self, from: data)
                        let results = root.results
                        for result in results {
                            for lexical in result.lexicalEntries {
                                for entry in lexical.entries {
                                    for sense in entry.senses {
                                        for example in sense.examples {
                                            print(example.text)
                                            self.array.append(example.text)
                                        }
                                    }
                                }
                            }
                        }

                        self.search = word
                        DispatchQueue.main.async() {
                            self.performSegue(withIdentifier: "goToDetail", sender: nil)
                        }
                    } catch {
                        print(error)
                    }
                }
            }
            dataTask.resume()
        }
    }
...