티스토리 뷰

 

collection > document > collection

 

 

whereField 추가 가능. 

 

 

====

파이어베이스의 realtime DB인 firestore에서 data를 받아오고, 또 DB에 data를 올리고 싶다면 어떤 함수들을 어떻게 써야하는지 내가 기억해두기 위해서 작성하는 게시글이다. 

 

리스너를 받아서 ListenerRegistration을 리턴하는 이 함수는, 리스너를 등록해주는 역할을 하는 함수이다. 

  func aaaa(listener: @escaping FIRQuerySnapshotBlock) -> ListenerRegistration {
    return db
    	.collection("race_end")
        .whereField("isStaff", isEqualTo: true)
    	.addSnapshotListener(listener)
  }

 

db.collection(콜렉션 이름).whereField(조건).addSnapshotListener(리스너)

 

저 함수는, 문서와 상관 없이, 모든 문서를 돌면서 조건에 맞는 애를 리턴해준다. 그래서 리턴 값은 배열 형태이다. 

 

만약 문서도 특정하고 싶다면 ?!?

 

db.collection.document.collection("").addSnapShotListener(리스너)

 

 

순서도 정해주고 싶다면?

 

   db.collection(collectionName)
      .order(by: "timestamp", descending: false)
      .getDocuments(completion: { snapshot, error in

.order(by: "", descending) 옵션을 추가해주면 된다. 

 

개수를 몇개만 받고 싶다면 ?      

.limit(to: 1)

 

 

=========

 

저 함수를 쓰는 곳에서, 

  @State var listener: ListenerRegistration?

 

 

listener = aaaa { snapshot, error in
      _ = snapshot?.documentChanges
        .map { Participant($0.document.data()) }
        .map { participant in
          RaceManager.shared.raceEndUsers.removeAll { user in user.userId == participant.userId } // 중복제거
          RaceManager.shared.raceEndUsers.append(participant)
        }
    }

 

aaaa가 함수를 인자로 받아서, 꽤 헷깔릴 수 있다.  

 

func aaaa(test: @escaping (block: Block, error: Error) -> Void) { } 라고 생각하면 된다. 

 

 

snapshot의 documentChanges를 받아왔다!!!

 

 .getDocuments(completion: { snapshot, error in
        let rooms = snapshot?.documents
          .map { ChatRoom($0.documentID, $0.data()) }

        completion(rooms, error)
      })

이 코드는 snapshot의 document를 받아왔다. 

 

 

 

 

 

함수 선언이랑 콜하는 부분으로 쪼개지 않고, 밑에 코드처럼 하나의 함수에서 다 처리할 수도 있다. 

  func validateRunner(_ email: String, _ entryNumber: String, _ completion: @escaping (Bool) -> Void) {
    var listener: ListenerRegistration?
    listener = db.collection("participants")
      .document(AppConfig.RACE_YEAR)
      .collection("runner")
      .whereField("email", isEqualTo: email)
      .whereField("entryNumber", isEqualTo: entryNumber)
      .addSnapshotListener { snapshot, error in
        listener?.remove()
        completion(snapshot?.documents.count == 1)
      }
  }

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함