Swift 3: Вы также можете использовать семафоры на этом пути. Это очень полезно, кроме того, вы можете точно отслеживать, когда и какие процессы будут завершены. Это было извлечено из моего кода:
//You have to create your own queue or if you need the Default queue
let persons = persistentContainer.viewContext.persons
print("How many persons on database: \(persons.count())")
let numberOfPersons = persons.count()
for eachPerson in persons{
queuePersonDetail.async {
self.getPersonDetailAndSave(personId: eachPerson.personId){person2, error in
print("Person detail: \(person2?.fullName)")
//When we get the completionHandler we send the signal
semaphorePersonDetailAndSave.signal()
}
}
}
//Here we will wait
for i in 0..<numberOfPersons{
semaphorePersonDetailAndSave.wait()
NSLog("\(i + 1)/\(persons.count()) completed")
}
//And here the flow continues...
В CodePlex есть инструмент под названием Managed Stack Explorer (который, я считаю, был создан Microsoft). Он использует API отладки и профилирования для захвата следов стека потоков в работающем приложении .Net без необходимости изменять приложение.
Вы можете запускать ваше приложение, пока не столкнетесь с проблемой, а затем проанализировать ее с помощью этого инструмента, чтобы зафиксировать текущие следы стека всех запущенных потоков. Преимущество этого подхода заключается в том, что вы оставляете свое приложение без изменений (инструментарий может изменить его поведение), и инструмент бесплатный.
Я не пробовал это сам, но это может быть полезно http://www.debuginspector.com/