func fetchPrivateAndSharedContacts()

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)))
            }
        }
    }