2016-07-30 3 views
0

저는 사용자가 내 앱에서 설정하고 FireBase에 저장할 수있는 지정된 반지름을 검색하기 위해 GeoFire를 사용하고 있습니다. 페이지가로드되면 GeoFire 쿼리를 실행하기 전에 Firebase에서 반지름을 가져옵니다. 그러나 아래 코드를 실행하면 다음 오류가 발생합니다. 'NSInvalidArgumentException'이라는 캐치되지 않은 예외로 인해 응용 프로그램을 종료합니다. 이유 : '정밀도가 23 미만이어야합니다!'GeoFire에서 저장된 검색 반경을 올바르게 사용하려면 어떻게해야합니까?

일부 전략적으로 배치 된 print 문을 가지고 놀면서, GeoFire 쿼리가 실행될 때 searchRadius가 0으로 반환되어 비동기 적재가 실행중인 것으로 의심됩니다.

내 searchRadius가 0이기 때문에이 오류가 발생합니다. 그렇다면 내 사용자의 검색 반경을 차지하는 FireBase 블록이 내 GeoFire 쿼리보다 먼저 실행되는지 어떻게 확인할 수 있습니까?

self.ref.childByAppendingPath("users/\(self.ref.authData.uid)/searchRadius").observeEventType(.Value, withBlock: { snapshot in 
     self.searchRadius = snapshot.value as! Double 
    }) 

    let center = CLLocation(latitude: 37.331469, longitude: -122.029825) 
    let circleQuery = geoFire.queryAtLocation(center, withRadius: self.searchRadius) 



    circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in 

     //Do code for each result returned 

    }) //End GeoFire query 

답변

0

예, 비동기로드 문제입니다. Firebase가 이미 searchRadius의 값을 캐싱했다하더라도 값 콜백은 인라인으로 실행되지 않습니다. 값이 업데이트되기 전에 스레드가 GeoFire 쿼리를 설정합니다.

이 코드 스 니펫을 기반으로 콜백 내부에서 쿼리 코드를 이동하여 쿼리를 실행하기 전에 반경이 설정되도록 할 수 있습니다. searchRadius 값이 변경되면 조회가 다시 실행되지 않도록 단일 이벤트를 관 {할 수도 있습니다.

self.ref.childByAppendingPath("users/\(self.ref.authData.uid)/searchRadius").observeSingleEventOfType(.Value, withBlock: { snapshot in 
    self.searchRadius = snapshot.value as! Double 
    let center = CLLocation(latitude: 37.331469, longitude: -122.029825) 
    let circleQuery = geoFire.queryAtLocation(center, withRadius: self.searchRadius) 
    circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in 
     //Do code for each result returned 
    }) //End GeoFire query 
}) // End observeSingleEventOfType 
+0

감사! 당신의 설명은 대단히 감사합니다. –