2016-07-16 2 views
7

파이어베이스 검색 데이터에 대해 묻고 싶습니다. firebase가 데이터 검색을 처리하는 방법은 무엇입니까? 완료 처리기가 표시되지 않습니다. 이 firebase 데이터 검색이 끝난 후에 일부 함수를 호출하고 싶습니다. 어떻게 처리 할 수 ​​있습니까 ???Firebase가 데이터 검색을 마친 시점을 코드가 어떻게 알 수 있습니까?

DataService.ds.POST_REF.queryOrderedByChild("created_at").observeEventType(.ChildAdded, withBlock: { snapshot in 
     if let postDict = snapshot.value as? Dictionary<String, AnyObject> { 
      let postKey = snapshot.key 
      let post = Post(postKey: postKey, dictionary: postDict) 
      self.posts.append(post) 
     } 
    }) 

답변

4

Firebase에서는 실제로 '완료'('자식 추가'수신 대기) 개념이 없습니다. 이것은 단지 데이터 스트림입니다 (초기 데이터가 '완료'되기 전에 누군가가 새로운 레코드를 추가한다고 상상해보십시오). 'value'이벤트를 사용하여 전체 객체를 가져올 수는 있지만 'child added'처럼 새 레코드가 추가되지는 않습니다.

일 때 실제로 추가 된 자식을 사용하고 알림을 받아야하는 경우 일 수 있습니다. 타이머를 설정할 수 있습니다. 나는 빨리 알지 못한다. 그러나 여기에 논리가있다.

  1. '자식 추가'이벤트를 설정하십시오.
  2. 500ms 내에 finishedLoading() 함수를 호출하는 타이머를 설정합니다.
  3. '자식 추가'이벤트가 트리거 될 때마다 2 단계에서 설정 한 타이머를 삭제하고 다른 하나를 만듭니다 (다시 500ms 연장).

새 데이터가 들어오지 않으면 타이머가 연장되지 않고 finsihedLoading()이 500ms 후에 호출됩니다.

500ms는 그냥 정해진 숫자이며, 어울리는 것을 사용하십시오.

0

SingleEventOfType (.Value)에 대해 하나의 요청을 수행하십시오. 이렇게하면 처음에는 모든 정보가 한 번에 표시되므로 일단 데이터를 가져 가면 원하는 모든 기능을 수행 할 수 있습니다. 다음

당신은 childAdded에 대해 별도의 쿼리를 만들 수 있으며, 당신이 새 게시물이

2

그래서 같은 완료 핸들러가 함수에 코드의 전체 블록을 쓰기 추가되었을 때하고 싶은 거기에 아무것도 할 :

func aMethod(completion: (Bool) ->()){ 
DataService.ds.POST_REF.queryOrderedByChild("created_at").observeEventType(.ChildAdded, withBlock: { snapshot in 
     if let postDict = snapshot.value as? Dictionary<String, AnyObject> { 
      let postKey = snapshot.key 
      let post = Post(postKey: postKey, dictionary: postDict) 
      self.posts.append(post) 
     } 
     completion(true) 
    }) 
} 

는 다음과 같이 어딘가에 전화 :

aMethod { success in 
guard success == true else { 
//Do something if some error occured while retreiving data from firebase 
return 
} 
//Do something if everything went well. 
. 
. 
. 
+0

이 .childAdded 스냅 샷 작동하지 않습니다 ... –

관련 문제