2016-07-17 3 views
0

나는 사용자와 질문이라는 두 가지 컬렉션을 가지고 있습니다.Firebase에서 동 기적으로 데이터를 검색하는 방법은 무엇입니까?

userId를 사용하여 로그인 한 사용자를 기준으로 currQuestion 값을 users 컬렉션에서 가져옵니다.

currQuestion 값을 기준으로 Firebase Questions 컬렉션에서 question 문서를 검색해야합니다.

나는 userId를에게

rootRef.child("0").child("users") 
     .queryOrderedByChild("userId") 
     .queryEqualToValue("578ab1a0e9c2389b23a0e870") 
     .observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

      for child in snapshot.children { 
       self.currQuestion = child.value["currentQuestion"] as! Int 
      } 
      print("Current Question is \(self.currQuestion)") 

      //print(snapshot.value as! Array<AnyObject>) 
     }, withCancelBlock : { error in 
       print(error.description) 
     }) 

를 검색하기 위해 아래의 코드를 사용했습니다 및 질문을

rootRef.child("0").child("questions") 
.queryOrderedByChild("id") 
.queryEqualToValue(currQuestion) 
.observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
      for child in snapshot.children { 
       print(child.value["question"] as! String) 
      } 

      }, withCancelBlock: { error in 
       print(error.description) 
     }) 

를 검색하지만 위의 코드는 비동기 적으로 실행합니다. 난이 동기 또는 청중을 구현하는 방법을 해결하기 위해 솔루션을해야합니다 질문을 다시 화재로 currQuestion 값이 변경되면?

+3

필요한 모든 작업을 수행하려면 완료 블록을 사용하십시오. 동기화하지 마십시오. – Paulw11

답변

5

완성 처리기를 매개 변수로 사용하고 해당 코드 블록이 완료되기를 기다리는 고유 한 메서드를 작성합니다. 그래서 같이 :

func someMethod(completion: (Bool) ->()){ 
rootRef.child("0").child("users") 
    .queryOrderedByChild("userId") 
    .queryEqualToValue("578ab1a0e9c2389b23a0e870") 
    .observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

     for child in snapshot.children { 
      self.currQuestion = child.value["currentQuestion"] as! Int 
     } 
     print("Current Question is \(self.currQuestion)") 
     completion(true) 
     //print(snapshot.value as! Array<AnyObject>) 
    }, withCancelBlock : { error in 
      print(error.description) 
    }) 
} 

그리고 당신이 그 함수를 호출 할 때마다 다음과 같이 전화 :

someMethod{ success in 
if success{ 
//Here currValue is updated. Do what you want. 
} 
else{ 
//It is not updated and some error occurred. Do what you want. 
} 
} 

완료 핸들러는 일반적으로 완전히 실행 완료 코드 블록을 기다리는 데 사용됩니다. P. 주 스레드를 차단하지 않는 한 비동기 요청은 위에 표시된 코드와 같은 완료 핸들러를 추가하여 동기 동작을 수행합니다.

그것은 단순히 당신이 먼저 업데이트 될 (서버에서 데이터 async를 수신) 및 currValue 대기한다 무엇을 당신은 내가 보여준 방법처럼 someMethod를 호출 할 때 기능 someMethod 마지막이자 유일한 매개 변수 이후 클로저 (별칭 후행)이면 괄호를 건너 뛰고 호출 할 수 있습니다. Here은 폐쇄에 대한 좋은 읽을 거리입니다. 그리고 클로저가 타입 (Bool) ->()이기 때문에 코드가 completion(true) 일 때 작업을 마치면 someMethod에게 말한 다음, 호출 할 때 success으로 호출하면됩니다. 원하는 단어) 부울 부울 이렇게 선언 된대로 다음 함수 호출에 사용하십시오. 희망이 도움이됩니다. :)

+0

코드의 두 번째 부분을 설명 할 수 있습니까? 또는 완료 처리기를 설명하는 유망한 소스를 알려주십시오. – Spark

+1

질문에 대한 답변을 편집했습니다. 당신이 무언가를 이해하지 못한다면 언제든지 물어보십시오. :) – Dershowitz123

+0

그래서 후속 질문이 있습니다. 나는 처음에는 xCode에 고유 한 특성 인 UICollectionView를로드하기 전에 plist 데이터가 완전히로드된다는 사실 때문에 원활하게 작동하는 데이터 소스에 대해 plist를 처음에 사용한 응용 프로그램을 사용합니다. 필자는 Firebase에서 데이터를 가져 오는 동안 코드가 계속 앞으로 움직이기 때문에 Firebase가 문제를 일으키는 데이터 소스로 활용하기를 원합니다. 그래서 뷰가 비어있을 때 UIViewController viewdidload 함수가 데이터를 검색하기 전에 호출됩니다! 먼저 Firebase에서 데이터를 가져올 때까지 뷰를 강제로로드하지 않습니까? –

관련 문제