如何在 Swift 中使用 PromiseKit 和 Firebase?

Posted

技术标签:

【中文标题】如何在 Swift 中使用 PromiseKit 和 Firebase?【英文标题】:How to use PromiseKit with Firebase in Swift? 【发布时间】:2017-06-07 01:09:28 【问题描述】:

所以我导入 PromiseKit 然后尝试

 FIRDatabase.database().reference().child("somechild").removeValue().then  
///// 

显然,这不起作用,我想知道如果可能的话,我还缺少什么让 Promise 与 Firebase 一起工作。我想要完成的是使用一个 catch 方法一次删除四个 Firebase 引用。

使用 nodeJs 我会很容易使用:

 Promise.all ([
someRef.remove(),
 someRef.remove(),
someRef.remove(),
someRef.remove()
]).then (function(

).catch(
//handle error
)

有没有办法在 Swift 中实现这一点?

【问题讨论】:

这个问题有点模糊,因为不清楚用例是什么;即对于您的案例,Promise 和 Firebase 之间的相关性是什么? Firebase 已经是异步的,因此有多种方法可以同步和异步删除子节点。在这里查看我的答案,因为它可能会有所帮助Delete Several Child Values 我不知道我能做到这一点,这真的很有帮助! 我在寻找类似的东西......我最终做的是一个使用泛型的较小的“PromiseKit”......比如 Promise 并且当快照被填充时,它会调用一个委托视图并填充信息... 【参考方案1】:

您可以使用fulfill 和reject 包装Firebase 函数

/// Get chat IDs of user conversations
///
/// - Returns: array of user chat IDs
private func getUserChatIds() -> Promise<[String]> 

    return Promise  fulfill, reject in
        let userChatIDsRef = Database.database().reference()
            .child(FireDatabasePaths.UserInfoPath.rawValue)
            .child(userID).child("chatIDs")

        userChatIDsRef.observe(.childAdded, with:  snapshot in

            if let chatIDdic = snapshot.value as? [String: AnyObject] 
                let keys = Array(chatIDdic.keys)
                fulfill(keys)
             else 
                reject(FirebaseError.empty)
            

        )
    

【讨论】:

函数开头的关键字“private”有什么不同? @DarrowHartman 它不是必需的。这取决于您的功能可访问性级别。我定义这个函数的类要求函数是私有的

以上是关于如何在 Swift 中使用 PromiseKit 和 Firebase?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Combine + Swift 复制 PromiseKit 风格的链式异步流

使用 PromiseKit 6 在 Swift 4.2 中缓存

PromiseKit ios Swift 闭包返回类型问题

使用 PromiseKit 从 Objective C 到 Swift 的桥接

Swift 4 - 使用 PromiseKit 调用嵌套

使用 Alamofire 和 PromiseKit 使用 Swift 时出现 Void 错误(请求)