Swift 4 完成处理程序:数组保持为空

Posted

技术标签:

【中文标题】Swift 4 完成处理程序:数组保持为空【英文标题】:Swift 4 completion handler: Array remains empty 【发布时间】:2020-07-01 20:25:18 【问题描述】:

我在从 Firebase 获取用户时尝试填充一个数组。当我设置断点时,我可以看到,所有用户都附加到数组中,但是当调试器完成时,数组又是空的。

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
    

【问题讨论】:

【参考方案1】:

您调用完成处理程序的时间过早。当你的completionHandler(.success(tempFirebaseUsers)) 运行时,tempFirebaseUsers.append(user) 还没有运行。

要解决此问题,请将对完成处理程序的调用移至回调中:

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

【讨论】:

很好,谢谢!好的,completionHandler 中传递的数组现在包含值。问题是,completionHandler 会为每个用户调用,因为这个 fetchUsers 函数一次返回一个用户。我怎么说:等待发送 completionHandler,直到每个用户都被获取并附加到 tempFirebaseUsers 数组中? 您共享的 sn-p 中只有一个调用。但是如果你多次这样做,我通常会保留一个计数器,在循环内增加它,并且只有在我读取了所需数量的文档后才调用完成处理程序。这是一个这样做的例子:***.com/questions/62666162/… 我已经设法修复它。我重写了我的 firebaseFunctions.fetchUsers。非常感谢您帮助我完成处理程序!

以上是关于Swift 4 完成处理程序:数组保持为空的主要内容,如果未能解决你的问题,请参考以下文章

设置值后 pyQt 进度对话框保持为空

POST 后 MongoDB 数组保持为空

推送后数组保持为空

在承诺中使用 Array.push 时,数组保持为空

1.合并两个数组,并保持仍然有序。2.删除合并后数组中的重复元素

Swift : 使用多个 swift 文件或仅使用一个 viewController?保持清洁