@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.
@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.
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.
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
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 {}
Réponses
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 fonctionmakeTheRequest
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.Non,
print
n'est pas thread safe, du moins pas sous macOS. Petit test à faire chez toi: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 leprint
dans lesink
tout fonctionne correctement.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.
Il faut que tu donnes plus de code, de ce que tu fais ensuite avec ton tableau
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
Ah bah c'est normal alors :
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 {}
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!