Je sais qu'il y a déjà beaucoup de contributions pour ce sujet. J'ai essayé différentes variations avec DispatchGroup, mais il semble que je ne suis pas capable de faire toute la boucle jusqu'à ce qu'une certaine tâche soit terminée.Comment faire une boucle attendre jusqu'à ce que la tâche est terminée
let names = ["peter", "susan", "john", "peter", "susan", "john"]
var holding = [String: [Double]]()
for i in 0...10 {
for name in names {
if holding[name] == nil {
Alamofire.request("https://jsonplaceholder.typicode.com", parameters: parameters).responseJSON { responseData in
// do stuff here
holding[name] = result
}
} else {
// do other stuff with existing "holding[name]"
}
// if if holding[name] == nil, the whole process should wait
}
}
Si je suis en utilisant DispatchGroup, les demandes Alamofire sont exécutées une par une, mais la boucle entière ne reconnaît pas si holding[name]
existe déjà. Donc holding[name]
est toujours nil
car la boucle n'attend pas.
Merci beaucoup!
EDIT:
Selon les réponses Mikes's et Versus', j'ai essayé les éléments suivants:
var names = ["peter", "susan", "john", "peter", "susan", "john"]
var holding = [String: [Double]]()
let semaphore = DispatchSemaphore(value: 1)
for i in 0...10 {
DispatchQueue.global().async { [unowned self] in
self.semaphore.wait()
for name in names {
if holding[name] != nil {
Alamofire.request("https://jsonplaceholder.typicode.com", parameters: parameters).responseJSON { responseData in
// do stuff here
holding[name] = result
semaphore.signal()
}
} else {
// do other stuff with existing "holding[name]"
semaphore.signal()
}
// if if holding[name] != nil, the wholeprocess should wait
}
}
}
Mais malheureusement, les accidents d'applications. Qu'est-ce que je fais mal?
Est [cette question] (https: // stackoverflow.com/questions/41809000/call-completion-block-when-two-other-completion-blocks-have-been-called) liés à votre problème? –
Où l'application se bloque et quel est le journal? –
Ceci est le plus facile: [image] (http://imgur.com/a/6zZTL) –