Получить значение из HTTP-запроса и обновить значение метки UIView - PullRequest
0 голосов
/ 05 июня 2019

Я строю эту функцию в swift, которая делает HTTP-запрос для получения значения температуры, чем при этом значении, оно должно отображаться в приложении iPhone.

Так что это функция:

func getTemperatura()
{
    NSLog("getTemperatura")
    // qui devo fare una chiamata ed aggiornare la temperatura
    var myURLString = "http://" + url!.link!+"/TEMP";
    var temperatura = sendHttpRequestTemp(endPoint: myURLString)
    self.labelTemp.text = String(format: "%.0f", temperatura);
    self.labelDecimal.text = ".09";
    self.humText.text = "30%";
    temp = temp + 1;
}

это метод sendHttpRequestTemp, который возвращает значение типа Double.

func sendHttpRequestTemp(endPoint : String) -> Double{
    let url = URL(string: endPoint)!
    var valTemp = 0.0
    var request = URLRequest(url: url)
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "GET"

    let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data,
        let response = response as? HTTPURLResponse,
        error == nil else {                                              // check for fundamental networking error
            print("error", error ?? "Unknown error")
            return
        }

        guard (200 ... 299) ~= response.statusCode else {                    // check for http errors
            print("statusCode should be 2xx, but is \(response.statusCode)")
            print("response = \(response)")
            return
        }
        let responseString = String(data: data, encoding: .utf8)
        //RECUPERO I DATI RELATIVI ALLA TEMPERATURA:
        var temperatura = responseString!.components(separatedBy: "$");
        if(temperatura.count  > 1){
            print ("temperatura ricavata:  \(temperatura[1])");
            valTemp = Double(temperatura[1])!
        }
     //   print("responseString = \(responseString)")
    }

    task.resume()
    return valTemp
}

Он не работает правильно, поскольку метод sendHttpRequestTemp имеет тип Async, а затем возвращает температуру = 0,0 вместо правильного значения.

Метод getTemperatura () вызывается этим кодом каждые 60 секунд:

var tempTimer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: Selector("getTemperatura"), userInfo: nil, repeats: true)

Есть ли способ правильно выполнить эту операцию?

1 Ответ

2 голосов
/ 05 июня 2019
func sendHttpRequestTemp(endPoint : String, success: @escaping (Double) -> ()){
        let url = URL(string: endPoint)!
        var request = URLRequest(url: url)
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.httpMethod = "GET"

        let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data,
            let response = response as? HTTPURLResponse,
            error == nil else {                                              // check for fundamental networking error
                print("error", error ?? "Unknown error")
                success(0.0)
                return
            }

            guard (200 ... 299) ~= response.statusCode else {                    // check for http errors
                print("statusCode should be 2xx, but is \(response.statusCode)")
                print("response = \(response)")
                return
            }
            let responseString = String(data: data, encoding: .utf8)
            //RECUPERO I DATI RELATIVI ALLA TEMPERATURA:
            var temperatura = responseString!.components(separatedBy: "$");
            if(temperatura.count  > 1) {
                print ("temperatura ricavata:  \(temperatura[1])");
                let temp = Double(temperatura[1])!
                success(temp)
            }
            //   print("responseString = \(responseString)")
        }
        task.resume()
    }

Примечание: при необходимости обработать ошибку. Я возвращаю 0.0, если произошла ошибка. После этого вы можете вызвать вашу функцию как:

func getTemperature() {
    NSLog("getTemperatura")
    // qui devo fare una chiamata ed aggiornare la temperatura
    var myURLString = "http://" + url!.link!+"/TEMP";
    sendHttpRequestTemp(endPoint: myURLString) { temp in
         self.labelTemp.text = String(format: "%.0f", temp);
    }
    self.labelDecimal.text = ".09";
    self.humText.text = "30%";
    temp = temp + 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...