in Sharing/ViewModels/ViewModel.swift [79:123]
func fetchPrivateAndSharedContacts(
completionHandler: @escaping (Result<([Contact], [Contact]), Error>) -> Void
) {
// Multiple operations are run asynchronously, storing results as they complete.
var privateContacts: [Contact]?
var sharedContacts: [Contact]?
var lastError: Error?
let group = DispatchGroup()
group.enter()
fetchContacts(scope: .private, in: [recordZone]) { result in
switch result {
case .success(let contacts):
privateContacts = contacts
case .failure(let error):
lastError = error
}
group.leave()
}
group.enter()
fetchSharedContacts { result in
switch result {
case .success(let contacts):
sharedContacts = contacts
case .failure(let error):
lastError = error
}
group.leave()
}
// When all asynchronous operations have completed, inform the completionHandler of the result.
group.notify(queue: .main) {
if let error = lastError {
completionHandler(.failure(error))
} else {
let privateContacts = privateContacts ?? []
let sharedContacts = sharedContacts ?? []
completionHandler(.success((privateContacts, sharedContacts)))
}
}
}