2017-12-12 13 views
0

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 { 

    } 
} 

하지만 내가 발견 한 것은 그들이 MapControllerif (diff.type == .added)에 돌아올 때 두 번 실행 및 인쇄 ("추가")된다는 점이다 두 번 currentuser의 fireauth ID가 경우에도 발생 컬렉션 submittedMarkers 아래에 한 번만 추가되었습니다.

diff.document.ID 나는 firestore에 이미 있던 사용자의 fireauth ID와 방금 새 문서를 추가 한 현재 사용자를 모두 얻습니다.

저는 청취자가 어떻게 작동하는지 알지 못합니다. if(diff = .added)submittedMarkers 컬렉션을 듣고 새 문서가 추가되면 한 번만 실행됩니다. ->AddMarkerController 나는 MapController을 떠날 때

  1. 나는 청취자를 분리하지 마십시오 문제가있는 경우

    나는 확실하지 않았다?

  2. 리스너는 그것이 전체 스냅 샷을 할 때마다 뭔가를 반복하는 snapshot.documentChanges.forEach이 첫 번째 added

답변

1

변경이든 viewWillAppear

  • 에 있어야 viewWillAppear하지 viewDidLoad에 있지만, 중포 기지 블로그를 읽고있다 setData()으로 전화하는 즉시 해고되는 지역 행사. 두 번째 added은 서버가 데이터를 쓴 후 확인 된 이벤트입니다.

    설명서의 events for local changes 섹션을 참조하십시오.

    또 다른 이유는 관찰자의 등록을 취소하지 않았기 때문일 수 있습니다. 옵저버를 viewWillAppear에 등록하면 viewWillDisappear 또는 viewDidDisappear에서 등록을 취소하십시오. 그렇지 않으면 동일한 이벤트에 대해 여러 명의 관찰자가 생겨 여러 차례 호출하게됩니다.

  • +0

    안녕하세요. 나는 여전히 같은 행동을하고있다. 내 앱에 두 번째 사용자로 로그인했습니다. Firestore의 단일 마커가 적절히로드되고 diff = .added가 한 번 트리거됩니다. 하지만 MapController에서 다른 컨트롤러로 갈 때마다 viewWillAppear가 항상 실행되지만, 매번 다시로드되는 Server 데이터와 함께 diff == .added에 다시 나타납니다. 나는 더 많은 정보와 함께 원래 게시물의 끝에 업데이 트를 넣어. 내 청취자가 다시 볼 때마다 등록 될지 궁금합니다 .WillAppear. 감사. – Mike

    +0

    아, 그럴 수 있습니다. 나는 * 귀하의 질문에 * 모든 * 코드 + 설명을 읽지 않았 음을 인정해야합니다 (일반적으로 적은 수는 더 많습니다). observer를'viewWillAppear'에 등록하면'ViewWillDisappear' 또는'viewDidDisappear'에서 등록을 해제하십시오. 그렇지 않으면 동일한 이벤트에 대해 여러 명의 관찰자가 생겨 여러 차례 호출하게됩니다. –