Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法附加检索到的文档_Ios_Swift_Firebase_Google Cloud Firestore - Fatal编程技术网

Ios 无法附加检索到的文档

Ios 无法附加检索到的文档,ios,swift,firebase,google-cloud-firestore,Ios,Swift,Firebase,Google Cloud Firestore,我无法将基于Swift IOS的聊天应用程序中从Firestore数据库检索到的文档附加到“messages”变量中,在附加后,我已按照代码中的以下方式配置表格单元格,我收到以下错误 错误 代码 将self.messages.append(文档)替换为self.messages.append(文档内容) 第一个方法采用单个元素,第二个方法采用您的示例中的集合。 var消息:[[String:Any]]=[] db.collection(“messages”).document(“hello”).

我无法将基于Swift IOS的聊天应用程序中从Firestore数据库检索到的文档附加到“messages”变量中,在附加后,我已按照代码中的以下方式配置表格单元格,我收到以下错误 错误

代码


self.messages.append(文档)
替换为
self.messages.append(文档内容)

第一个方法采用单个元素,第二个方法采用您的示例中的集合。
var消息:[[String:Any]]=[]
db.collection(“messages”).document(“hello”).collection(“newmessages”).document(“2”).collection(“hellos”).document(“K”).collection(“messages”).addSnapshotListener{querySnapshot,错误在
guard let documents=querySnapshot?.其他文档{
打印(“获取文档时出错:\(错误!)”)
回来
}
用于文档中的文档{
self.messages.append(doc.data())
}
}

虽然还有另外两个非常好的答案,但在这两个答案之间可能存在一些混淆

FIRDocumentSnapshot   (Note: renamed to DocumentSnapshot)
当您想要获取特定文档时返回:someDoc.getDocument(

将观察者添加到集合或检索一系列文档时返回:someCollection.getDocuments,然后QuerySnapshot中的每个文档都是一个离散的FIRQueryDocumentSnapshot(重命名为QueryDocumentSnapshot)。(例如,迭代QuerySnapshot以获取子QueryDocumentSnapshot)

请注意,如果文档不存在,DocumentSnapshot可能会在数据属性中返回nil,因此可以测试.exists。而QueryDocumentSnapshot将永远不会为nil(exists始终为true),因为不会返回已删除的数据

在这个问题中,一个观察者被添加到一个集合中

.collection("messages").addSnapshotListener
因此,返回的数据是QuerySnapshot,要将其存储为var,需要匹配var类型

var messagesQuerySnapshot: QuerySnapshot!
然后在听者里面

db.collection("messages")...addSnapshotListener { querySnapshot, error in
   messagesQuerySnapshot = querySnapshot
不过,我不建议这样做

我建议使用从Firestore检索的数据初始化messages类,并将其存储在数组中

class MessagesClass {
   var msg_id = ""
   var msg = ""
   var from = ""

   convenience init(withQueryDocSnapshot: QueryDocumentSnapshot) {
      //init vars from the document snapshot
   }
}
然后是一个类var数据源数组来保存它们

var messagesArray = [MessageClass]()
然后编写代码来读取消息,创建消息对象并将它们添加到数据源数组中

db.collection("messages")...getDocuments { querySnapshot, error in
   guard let snapshot = querySnapshot else {
      print("Error fetching snapshots: \(error!)")
      return
   }

   for doc in snapshot.documents {
      let aMsg = MessageClass(withQueryDocSnapshot: doc)
      self.messagesArray.append(aMsg)
   }
}
注意:我们不是在这里添加侦听器,而是一次性获取文档。如果您想添加侦听器以监视用户的添加、更改或删除,则需要额外的代码来检测更改


请参阅上的Firebase文档,您正试图将
QueryDocumentSnapshot
附加到
DocumentSnapshot
。将文档附加到数组的方法只需一个元素。您应该使用此@SureshMopidevi是的,我知道这是不可能的,实际上我引用了friendlychats of code的示例基于实时数据库的实验室,然后我将数据库模式转换为Firestore数据库,现在我陷入了这一结帐的困境。我的答案你可以附加到
消息
数组,或者你可以创建消息模型并从文档数据解码。这个库可以轻松地解码时间戳。QueryDocumentSnapshot inher从DocumentSnapshot,您可以只附加对象。此外,不需要for循环,它有一个方法。这个答案并不正确,因为每次添加、更改或删除消息时,所有消息都会附加到消息数组。此外,使用此路由,您还可以释放每条消息的documentID,以便在需要时若要删除、标记为“已读”等,您将无法直接访问文档ID。这是不正确的。因为添加了侦听器,所以无论何时添加、更改或删除消息,所有消息都将重新添加到数组中。例如,如果数组中包含消息0和消息1,然后将稍后的消息2添加到Firest中或者,数组将包含[message_0、message_1、message_0、message_1、message_2]等。
class MessagesClass {
   var msg_id = ""
   var msg = ""
   var from = ""

   convenience init(withQueryDocSnapshot: QueryDocumentSnapshot) {
      //init vars from the document snapshot
   }
}
var messagesArray = [MessageClass]()
db.collection("messages")...getDocuments { querySnapshot, error in
   guard let snapshot = querySnapshot else {
      print("Error fetching snapshots: \(error!)")
      return
   }

   for doc in snapshot.documents {
      let aMsg = MessageClass(withQueryDocSnapshot: doc)
      self.messagesArray.append(aMsg)
   }
}