首页 > 解决方案 > 通过循环 SWIFT 将删除数据延迟到 Firestore 数组字段值中

问题描述

在此处输入图像描述

我正在尝试通过这样的 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 上的所有购物车项目然后加载它们呢?提前非常感谢。

标签: iosswiftgoogle-cloud-firestorequeuesemaphore

解决方案


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)
         }
}

推荐阅读