티스토리 뷰

macOS, iOS

[iOS] firestore 함수들 정리

SweetDev 2020. 4. 1. 16:58

 

class BaseRepository {
  var db: DocumentReference {
    return Firestore.firestore()
      .collection(UserDefaults.tournamentName!)
      .document(UserDefaults.tournamentYear!)
  }
}

import Firebase 해주고, 

 

Firestore.firestore().collection("").document("")

 

 

계속 바뀌는 값 받아오기 ( 조건 걸기도 가능, 젤 밑에 예제 참조)

  private var startedListener: ListenerRegistration?
    /// 진행 중 참가자 수
  func countOfStartedRunner(_ course: String, _ listener: @escaping FIRQuerySnapshotBlock) -> ListenerRegistration {
    return passed
      .document(course)
      .collection("Start")
      .addSnapshotListener(listener)
  }
  startedListener = repository.countOfStartedRunner(course) {
   if let error = $1 { print("진행 중 사람 수 가져오기 실패: \(error)") }
   	  // 여기서 데이터를 받아와서 넣음
      self.runningIDsOriginal = $0?.documents.map { $0.documentID } ?? []
  }

 

문서 존재하는지 확인하기

 /// 골인 처리
  func goalIn(_ participant: Participant, _ completion: @escaping (Error?) -> Void) {
    let query = passed
      .document(UserDefaults.course!)
      .collection(collectionName)
      .document(uid)

    query.getDocument { document, error in
      if document!.exists {
        print("=== 이미 골인했음")
      } else {
        query.setData(participant.location.toDictionary()) {
          if let error = $0 {
            print("error: \(error)")
          } else {
            print("=== 골인으로 처리했음")
          }
        }
      }
    }

    raceEnd(participant, completion)
  }

 

문서 지우기

  ref.document("dummy_" + String(i)).delete()

 

조건 걸어서 문서 지우기

func removeDummyLocations() {
    currentLocations
      .whereField("isTemp", isEqualTo: true)
      .getDocuments { snapshot, error in
        snapshot?.documents.forEach { document in
          document.reference.delete()
        }
      }
  }

 

 

 

 

문서 제목과 내용 설정하기

func generateDummyRunners() -> [String] {
    // 기존에 더미데이터가 만들어진게 있으면 새로 생성하지 않는다.
    let ref = participants
    let query = participantsDatas
      .collection("runner")
      .document("dummy_1")
    var uidArray: [String] = []

    query.getDocument { document, error in
      if document!.exists {
        return
      } else {
        for i in 1 ... 100 {
          let uid = "".randomUID()
          uidArray.append(uid)
          
          ref
            .document("dummy_" + String(i))
            .setData([
              "course": "10k",
              "entryNumber": String(9899 + i),
              "isDNF": false,
              "isDerail": false,
              "isGoalIn": false,
              "isOffline": false,
              "isStaff": false,
              "isSweeper": false,
              "location": JSLocation(latitude: 1, longitude: 1).toDictionary(),
              "uid": uid,
            ])
        }
      }
    }
    return uidArray
  }

 

조건 걸어서 조건에 맞는 필드들만 가져오기

/// 선두 7명 위치 가져오기
  func leadingUsers(_ listener: @escaping FIRQuerySnapshotBlock) -> ListenerRegistration {
    return currentLocations
      .whereField("isStaff", isEqualTo: false)
      .whereField("course", isEqualTo: UserDefaults.course!)
      .whereField("isDNF", isEqualTo: false)
      .whereField("isGoalIn", isEqualTo: false)
      .order(by: "progress", descending: true)
      .limit(to: 7)
      .addSnapshotListener(listener)
  }

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함