Google지도를 사용하고 있으며 사용자가지도에지도 아이콘을 추가 할 수 있습니다. 지도 표시는 Firestore에 저장됩니다. 데이터베이스를 청취하는 리스너가 있습니다. 각 사용자는지도 마커 하나만 제출할 수 있으므로 데이터베이스의 각 사용자에 대해 하나의 문서 만 있습니다. 그러나 마커의 위도와 경도를 수정할 수 있습니다.하나의 문서가 추가되면 Firestore Listener가 .added를 두 번 반환하는 이유는 무엇입니까?
내 경우 FireStore은 다음과 같이 규정되어:
root
- submittedMarkers (collection)
- fireauthID_1 (document)
- field 1 (lat):
- field 2 (lng):
- fireauthID_2 (document)
- field 1 (lat):
- field 2 (lng):
// MapController.swift 디버깅을 위해 순간
override func viewWillAppear(_ animated: Bool){
listener = db.collection("submittedMarkers").addSnapshotListener { querySnapshot, error in
guard let snapshot = querySnapshot else {
print("Error fetching snapshots: \(error!)")
return
}
snapshot.documentChanges.forEach { diff in
if (diff.type == .added){
print("added")
}
if(diff.type == .modified) {
print("modified the document in firestore")
}
}
}
}
난 단지
submittedMarkers
아래의 경우 FireStore 한 사용자와 하나 개의 문서가 ->
{fireauthId}
을 .
내 앱이 현재로드 된 단일 마커를로드 할 때 "추가됨"이라는 단일 인쇄 문과 함께지도에 추가됩니다. 그렇게 작동합니다.
여기 제가 만난 문제가 있습니다.
새로운 사용자가 등록하고 소화기 ID를 얻으면 그들은 AddMarkerController
에서 마커를 추가 할 수 있습니다. 그들은 마커를 제출할 때 unwind segue를 사용하여 MapController
으로 되돌립니다. (나는 어떤 단계에서든 청취자를 MapController
에서 분리하지 않는다).
// AddMarkerController
docref = db.collection("submittedMarkers").document(currentUserId)
docref?.setData([
"latitude": latitude,
"longitude": longitude,
"date_time": date!,
"distance": dist,
"speed": speed
], options: SetOptions.merge()) { err in
if let err = err {
print("Error writing document: \(err)")
} else {
}
}
하지만 내가 발견 한 것은 그들이 MapController
if (diff.type == .added)
에 돌아올 때 두 번 실행 및 인쇄 ("추가")된다는 점이다 두 번 currentuser의 fireauth ID가 경우에도 발생 컬렉션 submittedMarkers
아래에 한 번만 추가되었습니다.
diff.document.ID
나는 firestore에 이미 있던 사용자의 fireauth ID와 방금 새 문서를 추가 한 현재 사용자를 모두 얻습니다.
저는 청취자가 어떻게 작동하는지 알지 못합니다. if(diff = .added)
은 submittedMarkers
컬렉션을 듣고 새 문서가 추가되면 한 번만 실행됩니다. ->AddMarkerController
나는 MapController
을 떠날 때
- 나는 청취자를 분리하지 마십시오 문제가있는 경우
나는 확실하지 않았다?
- 리스너는 그것이 전체 스냅 샷을 할 때마다 뭔가를 반복하는
snapshot.documentChanges.forEach
이 첫 번째added
는
안녕하세요. 나는 여전히 같은 행동을하고있다. 내 앱에 두 번째 사용자로 로그인했습니다. Firestore의 단일 마커가 적절히로드되고 diff = .added가 한 번 트리거됩니다. 하지만 MapController에서 다른 컨트롤러로 갈 때마다 viewWillAppear가 항상 실행되지만, 매번 다시로드되는 Server 데이터와 함께 diff == .added에 다시 나타납니다. 나는 더 많은 정보와 함께 원래 게시물의 끝에 업데이 트를 넣어. 내 청취자가 다시 볼 때마다 등록 될지 궁금합니다 .WillAppear. 감사. – Mike
아, 그럴 수 있습니다. 나는 * 귀하의 질문에 * 모든 * 코드 + 설명을 읽지 않았 음을 인정해야합니다 (일반적으로 적은 수는 더 많습니다). observer를'viewWillAppear'에 등록하면'ViewWillDisappear' 또는'viewDidDisappear'에서 등록을 해제하십시오. 그렇지 않으면 동일한 이벤트에 대해 여러 명의 관찰자가 생겨 여러 차례 호출하게됩니다. –