en cas de non réponse du serveur

Salut à tous, me revoilà pour une petite question. Je suis toujours sur mon appel réseau sur mon serveur Arduino . Tout fonctionne pas trop mal, j'ai ma réponse Json, mon image s'affiche en fonction de cette réponse mais voila j'aimerai pouvois afficher une autre image (test_etat) si le serveur n'a pas répondu ( si la carte arduina n'est pas alimentée par exemple); Voila ma fonction qui affiche l'état :
func etatCloture1() {

 guard let ipClo2 = textFieldAdresseIp1.text,

        let  clotureUrl2 = URL (string: "http://\(ipClo2)" )
          else { return}

    var request = URLRequest(url : clotureUrl2)
    request.httpMethod = "POST"

    let body = ""
    request.httpBody = body.data(using: .utf8)

    let session = URLSession(configuration: .default)
    let task = session.dataTask(with: request){ ( data, response, error ) in
        if let data = data, error == nil {



            if let response = response as? HTTPURLResponse, response.statusCode ==  200 {
                if let responseJSON = try? JSONDecoder().decode([String: String].self, from: data),
                   let text = responseJSON ["etatcloture"],
                let verrou = responseJSON  ["etatVerrou"] {

                    print (text)
                    print (verrou)

                    DispatchQueue.main.async {  // on reste dans la main Queue
                       // self.etatClotur1.text = text



                        if  text == "Allumee" {
                            self.etatImage.image = UIImage(named: "etat_allumée")

                        }



                        if  text == "Eteinte" {
                            self.etatImage.image = UIImage(named: "etat_eteint")

                        }






                        if verrou == "bloque"  {
                            self.cadenas.image = UIImage(named: "cadenas")
                        }

                        if verrou == "debloque"  {
                            self.cadenas.image = nil;
                        }

                    }

                }

            }


    }

    }
    task.resume()
    }

Réponses

  • LarmeLarme Membre
    juin 2021 modifié #2

    Si j'ai bien compris:

    if let data = data, error == nil { 
    ...
    } else {
        //There is no data OR error is not nil
        DispatchQueue.main.async {
            self.etatImage.image = UIImage(named: "test_etat")
        }
    }
    

    Je vois que tu n'en fais pas trop, mais ne jamais oublié que si tu as un if, tu as un else qui en découd, même si tu le vois pas...

  • Oui ça je l’ai fait, mais l’image s’affiche environ 2 mn après la requête ! C’est trop long
  • LarmeLarme Membre
    juin 2021 modifié #4

    Parce que tu as un Timeout de 2m. Réduis-le?
    Tu veux peut-être afficher cet image avant le call, dans un mode "je ne sais pas encore le résultat), et quand tu as ta réponse, tu changes l'image.

  • Et comment réduire ce timeout ? Ou tu vois que j’en ai un ?
  • LarmeLarme Membre

    Quand tu fais ça:

    URLRequest(url : clotureUrl2)

    Tu appelles en réalité:

    URLRequest(url: clotureUrl2, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 60.0)

    C'est dans la doc:
    init(url:cachePolicy:timeoutInterval:)

    À partir de combien de temps, considères-tu qu'une page web n'est pas joignable (souvent que le "site est down")? En fonction de ta connexion (Edge, 3G, 4G, Fibre, ADSL, 56k, WiFi rapide, etc.) ta page arrivera plus ou moins vite.
    Si tu considères qu'en étant sur ton réseau local pour ton Arduino, la réponse doit être obtenue en 10 secondes, alors mets 10 secondes.

    Sinon, comme dit, niveau UI, mettre un image dun "je ne sais pas encore" (un placeholder) en attendant d'avoir la réponse est toujours une solution.

  • nickel merci ça marche <3 <3 <3

Connectez-vous ou Inscrivez-vous pour répondre.