2016-06-09 2 views
1

오프라인 노드에서 시작된 응용 프로그램과 함께 firebase를 사용하고 있습니다. 일부 노드의 자식 값에 가입하면 observe*(_:,withBlock:)의 콜백이 실행되지 않습니다 가치 또는 변화). 직접 값에 대한 구독 (자식이 없음)은 정상적으로 작동합니다. 코드 조각에서 살펴 보자 :오프라인 모드에서 시작된 Firebase는 자식 값에 대해 osberve *를 실행하지 않습니다

let database = FIRDatabase.database() 
    database.reference().keepSynced(true) 
    let databaseRef = database.reference() 
    database.goOffline() 


    databaseRef.child("user").setValue("user1") 
    let userKey = databaseRef.child("usr").childByAutoId().key 
    let userValues = ["uid": "uid", 
         "name" : "name", 
         "surname" : "surname"] 
    databaseRef.child("/usr/\(userKey)/").setValue(userValues) 

    //1 
    databaseRef.child("user").observeSingleEventOfType(.Value, withBlock:{ snap in 
     print("works") 
    }) 
    //2 
    databaseRef.child("usr").observeSingleEventOfType(.Value, withBlock:{ snap in 
     print("doesnt work") 
    }) 
    //3 
    databaseRef.child("usr/\(userKey)/uid").observeSingleEventOfType(.Value, withBlock:{ snap in 
     print("works") 
    })` 

구독 1 개 &이 작품을 잘하지만, subscribtion 2 회 이상 데이터베이스가 온라인 때까지 발생하지 않습니다. 순간부터 데이터베이스와 원격 동기화 나는 오프라인으로 갈 수 있고 모든 것이 제대로 작동합니다. 누구든지이 문제를 처리하는 방법을 알고 있습니까?

답변

3

앱이 오프라인 일 때 Firebase 클라이언트는 캐시에서 이벤트를 실행합니다. 앱이 Firebase 서버에 접속 된 적이 없다면이 캐시는 비어 있습니다.

즉, Firebase 클라이언트는 요청한 위치에 값이 있는지 여부를 알지 못합니다. 이런 이유로 이벤트를 발생시키지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 그렇다면 왜 사건이 1과 2의 발췌 문장에서 해고되었는데, 어디에서 하나의 값을 자식 노드로 참조할까요? – mprostak

+0

숫자 3은 사용자 코드에서 해당 위치의 값을 설정했기 때문에 실행됩니다. 따라서 Firebase 캐시에는 해당 노드에 대한 값이 있습니다. 나는 당신의 첫 번째 테스트에도 똑같이 적용된다고 생각하지만 확실치 않습니다. –

+0

각 경우에 대해 값을 설정합니다. 1 : 노드 "user"에 대한 값 "user1"을 두 번째로 설정합니다. 노드 "usr"에 대한 값을 가진 자식 노드를 설정합니다. 3 번째로 자식에 단일 값을 설정합니다. 노드 "usr"에 대한 노드. 아직도 제 2의 사람이 아무리 해고당하는 지 이해하지 못한다. 적어도 온라인으로 한 번 방문하면 문제없이 오프라인 모드에서 작업 할 수 있습니다. 3 번의 테스트가 정상적으로 수행됩니다. 다시 말해, 앱을 삭제하고 오프라인에서 신선한 상태로 시작하면 문제가 발생합니다. – mprostak

-1

비슷한 문제가 있지만 updateChildValues과 딥 링크를 사용하고 있는데, 로컬 캐시가 중간 (/ 경로/중간/otherpath) 키 이벤트를 실행하지 못하게합니다. 내가 발견 한 해결 방법은 updateChildValues에 전달 된 사전에서 더 자세한 정보를 제공하는 것이 었습니다. (저는 여전히 이것이 Firebase SDK의 버그라고 생각합니다).

this Stack Overflow question