>

firestore의 문서 변경에 리스너를 추가하고 싶습니다. 어떻게 든 리스너가 여러 번 트리거되었지만 리스너가 한 번 트리거 한 코드를 실행하고 싶습니다. 기본적으로 리스너가 한 번 트리거 된 후 제거하고 싶습니다. 어떻게해야합니까? 감사합니다

업데이트 : 사용하려는 코드는 다음과 같습니다.

db.collection("cities").document("SF")
 .addSnapshotListener { documentSnapshot, error in
   guard let document = documentSnapshot else {
     print("Error fetching document: \(error!)")
     return
   }
   print("Current data: \(document.data())")
   //my other code
 }

리스너가 여러 번 트리거 될 수 있습니다. "다른 코드"만 한 번, 즉 리스너가 처음 트리거되기를 원합니다.


  • 답변 # 1

    다음과 같은 것을 찾고 있다고 생각합니다 :

    let count = 0
    let registration = db.collection("cities").document("SF")
     .addSnapshotListener { documentSnapshot, error in
       count = count + 1
       if count == 2 registration.remove()
       guard let document = documentSnapshot else {
         print("Error fetching document: \(error!)")
         return
       }
       print("Current data: \(document.data())")
       //my other code
     }
    
    

  • 답변 # 2

    문서 변경 사항을 수신하는 코드는 다음과 같습니다.

    /// Add listener to query
    listener = db.collection("cities").document("SF").addSnapshotListener { (querySnapshot, error) in
         /// Check if snapshot is not nil
          guard let snapshot = querySnapshot else {
               print("Error: \(error.debugDescription)")
               return
          }
          /// Check if snapshot has documents and not empty
          guard snapshot.documents.last != nil else {
               // The collection is empty.
               return
          }
          /// This is the on change listner  
          snapshot.documentChanges.forEach({ (diff) in
               print(diff.document.data())
               if (diff.type == .added) {
               }
               else if (diff.type == .modified) {
               }
               else if (diff.type == .removed) {
               }
          })
    }
    
    

    이제 listener 인스턴스가 생겼습니다.  언제든지들을 수 없습니다.

    listener.remove()
    
    

    BTW는 일회용으로 getDocuments(completion:) 를 사용해야합니다  한 번만 호출합니다.

    수정 : getDocuments(completion:)  예

    queryRef.whereField(key, isEqualTo: value).getDocuments(completion: { (querySnapshot, error) in
        if let _error = error {
            print (_error.localizedDescription)
            return;
        }
        guard let _querySnapshot = querySnapshot else {
              print("querySnapshot is nil")
              return;
        }
        for document in _querySnapshot.documents {
            print(document.data())
        }
    })
    
    

  • 이전 seaside - 스몰 토크를 배우시겠습니까?
  • 다음 reactjs - 반응/redux/다시 선택 - redux store에 저장된 데이터를 필터링하는 데 사용하기 위해 로컬 상태로 저장된 인수를 전달하는 방법은 무엇입니까?