user11718626
user11718626

Reputation:

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
    }

Upvotes: 0

Views: 417

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 600126

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
}

Upvotes: 1

Related Questions