JSON optimisation récupération des données

2»

Réponses

  • RocouRocou Membre

    @Larme a dit :
    response est nil alors? guard let response = response else { return } est executé ? N'oublie pas que c'est asynchrone. Tu as un // Handle HTTP request error, ça print quelque chose dedans?

    Je ne sais pas si response est nil. Je suppose que guard let response = response else { return } est exécuté puisque l'on entre bien dans la fonction makeTheRequest

    un // Handle HTTP request error ? Où ça? Si c'est dans la fonction makeTheRequest tout fonctionne correctement, je récupère bien le tableau qu'il me faut. Cependant je n'arrive pas à le récupérer en dehors de la fonction.

  • PyrohPyroh Membre

    @Larme a dit :

    @Pyroh a dit :
    Un print depuis un autre thread que le main n'a aucune chance d'afficher quoi que ce soit.

    Pas sur iOS en tout cas, et il ne me semble pas avoir vu ça sur macOS non plus...

    Non, print n'est pas thread safe, du moins pas sous macOS. Petit test à faire chez toi:

    var cancellables = Set<AnyCancellable>()
    
    [0, 1, 2, 3, 4].publisher
        .receive(on: DispatchQueue.global(qos: .utility))
        .sink { value in print(value, terminator: " ") }
        .store(in: &self.cancellables)
    [5, 6, 7, 8, 9].publisher
        .receive(on: DispatchQueue.main)
        .sink { value in print(value, terminator: " ") }
        .store(in: &self.cancellables)
    

    Chez moi j'obtiens quelque chose comme 0 5 6 7 8 9 1 3.
    Il manque des bouts venant de [0, 1, 2, 3, 4], si tu synchronize le print dans le sink tout fonctionne correctement.

  • RocouRocou Membre
    1 juin modifié #34

    Bon, je n'y arrive pas :(
    J'extraie toutes les données que je veux mais elles ne sont visibles QUE dans la fonction makeTheRequest().
    J'imagine que le programme se déroule alors que le thread initié par fonction makeTheRequest() n'est pas terminé. Dès lors, mon tableau de données est vide. Mais je n'ai ni idée ni piste pour continuer. J'ai fait le tour du net, vu que certains se posent les même questions que moi mais je n'ai pas trouvé de réponse, hélas.

  • LarmeLarme Membre

    Il faut que tu donnes plus de code, de ce que tu fais ensuite avec ton tableau

  • RocouRocou Membre

    Merci @Larme . Le but est de dessiner une courbe avec les données du tableau. Chaque nombre du tableau représente une valeur de y sur un repère orthonormé (uniquement positif). L'abscisse étant le temps, en l'occurrence 24h.
    J'avais pensé dessiner cette courbe au sein de la closure puisque là je suis sûr d'avoir les données mais l'appel à la fonction d'affichage de la courbe ne fonctionne pas quand elle est appelée au sein de la closure.

    En outre, j'ai un nouvel avertissement (de couleur violette) sur ma fonction d'affichage de la courbe:
    NSView.needsDisplay must be used from main thread only

  • LarmeLarme Membre

    Ah bah c'est normal alors :

    makeTheRequest(completion: { response in
            DispatchQueue.main.async {
            guard let response = response  else { return }
            //make something with response
            print("mon tableau de doubles: \(response.data.computedForthValues)")
            //drawMethod()
            }
    })
    

    La closure est appelée sur un background thread. Tu confirmes les dires de @Pyroh en signalant que tu es sur macOS et que les prints ne fonctionnent que sur le main thread (contrairement à iOS, plateforme que j'utilise).
    Donc une fois la requête fait, il faut "retourner" sur le main thread, via DispatchQueue.main.async {}

  • RocouRocou Membre

    Oui, les dires de @Pyroh sont exacts, j'ai les mêmes résultats.
    Je vais creuser du côté de DispatchQueue.main.async {}
    Merci pour cette piste!

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