-je effectuer URLSession.shared.downloadTask
demande, mais voudrait exécuter du code sur le même thread le downloadTask
a été exécuté sur. Par exemple:Comment exécuter un blocage sur une instance de thread?
func sample() {
let thread = Thread.current
URLSession.shared.downloadTask(with: file) {
someFunc() //How to execute on thread variable?
}.resume()
}
Dans le gestionnaire d'achèvement downloadTask
, il est en cours d'exécution sur un fil de fond. Cependant, je voudrais appeler someFunc()
sur le même fil sample()
a été appelé. Comment dois-je faire quelque chose comme Thread.current.async {...}
je peux le faire:
func sample() {
let thread = Thread.current
URLSession.shared.downloadTask(with: file) {
thread.async { someFunc() } //Doesn't compile
}.resume()
}
Cela peut résoudre le problème, mais les threads sont de très bas niveau et compliqués. Vous devez modifier l'invocation de la méthode 'sample' à transmettre à ce thread spécifique via' perform on: '. Vous pourriez avoir à faire face à des événements d'ordre créés par d'autres threads entre 'et' someFunc' Par échantillon ... La même chose peut être archivé en utilisant les API de haut niveau comme 'OperationQueue' qui devrait être le meilleur moyen. – andih
Je suis d'accord, c'est pourquoi j'ai fermé avec "utiliser GCD si vous le pouvez". Ce n'est cependant pas un bon cas d'utilisation pour les files d'attente d'opérations. Et bloquer le fil d'appel, comme vous le faites dans votre réponse, n'est jamais une bonne idée. – Rob
Vous avez raison, l'approche de blocage doit être évitée. Une autre approche qui évite le blocage serait d'utiliser des opérations dépendantes. – andih