Search code examples
arraysswiftfirebasegoogle-cloud-functionscompletionhandler

Swift 4 completion handler: Array remains empty


I'm trying to fill an array when fetching users from Firebase. When I set a breakpoint, I can see, that all users are appended to the array, but when the debugger is done, the array is empty again.

func firebaseRequest(completionHandler: @escaping (Result<[User], Error>) -> Void) {
        
        var tempFirebaseUsers = [User]()
        
        self.firebaseFunctions.fetchUsers { (userFB, error) in
            
            if let user = userFB {
                print("User: ", user)
                tempFirebaseUsers.append(user)
            } else if let error = error{
                completionHandler(.failure(error))
                return
            }
            
        }

        completionHandler(.success(tempFirebaseUsers))
        return
    }

Solution

  • You're calling your completion handler too early. When your completionHandler(.success(tempFirebaseUsers)) runs, the tempFirebaseUsers.append(user) hasn't run yet.

    To fix this, move the call to the completion handler into the callback:

    func firebaseRequest(completionHandler: @escaping (Result<[User], Error>) -> Void) {
        
        var tempFirebaseUsers = [User]()
        
        self.firebaseFunctions.fetchUsers { (userFB, error) in
            
            if let user = userFB {
                print("User: ", user)
                tempFirebaseUsers.append(user)
                completionHandler(.success(tempFirebaseUsers))
            } else if let error = error{
                completionHandler(.failure(error))
                return
            }
            
        }
    
        return
    }