Firestore NSArray到Swift.Array匹配错误

时间:2019-05-18 17:54:03

标签: ios swift google-cloud-firestore

我在使用Firebase / Firestore SDK时遇到以下问题:

  

前提条件失败:NSArray元素与Swift Array元素类型不匹配   预期为FIRQueryDocumentSnapshot,但找到了FIRQueryDocumentSnapshot:文件/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1001.2.63.12/swift/stdlib/public/core/ArrayBuffer.swift,第346行   2019-05-18 19:46:00.020040 + 0200 App [25051:288337]前提条件失败:NSArray元素与Swift Array元素类型不匹配   应该是FIRQueryDocumentSnapshot,但找到了FIRQueryDocumentSnapshot:文件/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1001.2.63.12/swift/stdlib/public/core/ArrayBuffer.swift,第346行

let listener = self.client
                .collection("countries/czechia/cities/\(id.rawValue)/venues")
                .addSnapshotListener({ (snapshot, error) in
                    guard let docs = snapshot?.documents else {
                        observer.onError(error!)
                        return
                    }

                    let arr: [Venue] = docs.compactMap { doc in // The code crashes on this line
                        do {
                            let decoded = try self.decoder.decode(Venue.self, from: doc.data())
                            return decoded
                        } catch {
                            print(error)
                            return nil
                        }
                    }
                }

1 个答案:

答案 0 :(得分:0)

使用伞框架技术时,此错误非常普遍。 我收到“ 前提条件失败:NSArray元素与Swift Array元素类型不匹配” 预期会出现FIRQueryDocumentSnapshot,但发现FIRQueryDocumentSnapshot还是…… ”崩溃错误,尽管只有一个Firebase实例引用了静态框架。

所以我不得不在特定的键值编码协议中使用强大的NSObject功能。

检查这个。...

let db = Firestore.firestore(app: firebase_instance)
    defaultsHelper.write(value: true, key: .isReceivingProspects)
    prospectosListener = db.collection("collection_name")
        .document("document_name")
        .collection("collection_name")
        .whereField("condition_parameter", arrayContains: "condition_value")
        .addSnapshotListener { querySnapshot, error in
            weak var _self = self
            
            guard let snapshot = querySnapshot else {
                print("Error fetching document: \(error!)")
                return
            }
            
            // snapshot.documents or snapshot.documentChanges in a loop produces crash
            guard let documents = (snapshot as NSObject).value(forKey: "documentChanges") as? NSArray else { return }
            
            for document in documents {
                guard let object = document as? NSObject else { debugPrint("object was nil"); return }
                guard let type = object.value(forKey: "type") as? Int else { debugPrint("type was nil"); return }
                guard let docs = object.value(forKey: "document") as? NSObject else { debugPrint("document was nil"); return }
                guard let data = docs.value(forKey: "data") as? [String: Any] else { debugPrint("data was nil"); return }
                guard let fbModel = _self?.documentConverter.convertToNotificationModel(documentData: data) else {
                    debugPrint("fbModel was nil")
                    return
                }
            
                switch type {
                    case 0: // Added
                        _self?.onAddedOrModifiedNotificationEvent(fbModel: fbModel)
                    case 1: // Modified
                        _self?.onAddedOrModifiedNotificationEvent(fbModel: fbModel)
                    case 2: // Removed
                        _self?.onDeleteNotificationEvent(fbModel: fbModel)
                default:
                    debugPrint("Another option")
                }
            }