【问题标题】:Delay of delete data into Firestore array field values through loop SWIFT通过循环 SWIFT 延迟删除数据到 Firestore 数组字段值
【发布时间】:2019-12-27 21:33:40
【问题描述】:

我正在尝试通过这样的 for 循环删除所有购物车项目:

func removeRelatedProductFromUserCart(selectArrayNodeIds: [String], completion: @escaping(Error?)->()) {
        let semaphore = DispatchSemaphore(value: 0)
        let serialQueue = DispatchQueue(label: "com.queue.Serial")

        serialQueue.async {
            for nodeId in selectArrayNodeIds {
                FirebaseManager.shared.removeProductFromUsersWishOrCartList(isForWishList: false, item: nodeId) { (error) in
                    completion(error)
                    semaphore.signal()
                }
                semaphore.wait()
            }
        }
    }

和 Firebasemanager:

func removeProductFromUsersWishOrCartList(isForWishList: Bool, item: String?, completion: @escaping (Error?) -> ()) {
        let uid = UserDefaults.standard.string(forKey: "uid")!
        if isForWishList == true {
            Firestore.firestore().collection("user").document(uid).updateData([
                "wishList": FieldValue.arrayRemove([item!])
            ]) { (error) in
                completion(error)
            }
        } else {
            Firestore.firestore().collection("user").document(uid).updateData([
                "cart": FieldValue.arrayRemove([item!])
            ]) { (error) in
                completion(error)
            }
        }
    }

然后,当我尝试从同一字段中获取购物车商品时,我会在延迟后获取更新后的购物车商品列表。我观察到打开firebase控制台的删除过程,我发现删除在控制台中发生了延迟。但是错误响应(error == nill) 并没有等到removeRelatedProductFromUserCart 中。那么我怎样才能等到删除 Firestore 上的所有购物车项目然后加载它们呢?提前非常感谢。

【问题讨论】:

    标签: ios swift google-cloud-firestore queue semaphore


    【解决方案1】:

    1- Firebase 在后台线程中运行,因此不需要

    let serialQueue = DispatchQueue(label: "com.queue.Serial")
    

    2- 你需要一个DispatchGroup

    func removeRelatedProductFromUserCart(selectArrayNodeIds: [String], completion: @escaping(Bool)->()) {
    
               let g = DispatchGroup() 
                for nodeId in selectArrayNodeIds {
                     g.enter()
                     FirebaseManager.shared.removeProductFromUsersWishOrCartList(isForWishList: false, item: nodeId) { (error) in  
                       q.leave()
                    } 
                } 
             g.notify(queue:.main) {
                completion(true)
             }
    }
    

    【讨论】:

    • 非常感谢您的回答。最后一点我如何在notify(queue: main) 中发送error?在这种情况下,我什至应该处理删除项目的每个错误吗?
    • 不,你不应该在updateData的成功内添加布尔完成
    • 虽然我是这样添加的 var err: Error? for nodeId in selectArrayNodeIds { dispatchGroup.enter() FirebaseManager.shared.removeProductFromUsersWishOrCartList(isForWishList: false, item: nodeId) { (error) in if error != nil { err = error } dispatchGroup.leave() } } dispatchGroup.notify(queue:.main) { completion(err) } 但我肯定会忽略。再次感谢。祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多