我在使用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
}
}
}
答案 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")
}
}