2017-03-26 3 views
0

Firebase에서 observeSingleEvent 작업이 끝난 후에 작업을 트리거하는 방법을 알아 내려고합니다.Firebase에서 데이터를 다운로드 한 후에 만 ​​작업을 수행하는 방법

뒤에 이유 나는 다음과 같은 작업을 할 필요가있다 :

  • 나는 이러한 데이터가 완전히 다운로드 될 때 데이터베이스
  • 에서 일부 데이터를 얻을 필요가 사용자로부터 하나 개의 입력에 따르면, I

    let listOfTags = [String]() 
        var outputArray = [String]() 
    
        if listOfTags.count != 0 { 
         for tag in listOfTags { 
    
          ref.child("tags").child(tag).observeSingleEvent(of: .value, with: { (snapshot) in 
    
           if let temp = snapshot.children.allObjects as? [FIRDataSnapshot] { 
            for elem in temp { 
             outputArray.append(elem.key) 
            } 
           } 
    
           // ... 
          }) { (error) in 
           print(error.localizedDescription) 
          } 
         } 
    
         // HERE I WANT TO DO AN ACTION "ONLY" AFTER THE FOR LOOP IS 
         // COMPLETED AND THE "outputArray" IS FILLED WITH ALL VALUES 
         doSomethingHere() 
    
        } 
    
    : 그들에게 조금 처리 및 기타 데이터를 검색하는 데 사용할 필요가이 코드를 사용하고 사용자가 현재

에 표시하는

그러나 doSomethingHere() 함수는 outputArray가 여전히 비어있을 때 즉시 실행된다는 것을 알았습니다! 그래서 아무것도하지 않습니다.

내 질문에, 어떻게이 함수는 다운로드 프로세스가 완료된 후 실행되도록 프로그램을 구성 할 수 있습니까? 어쩌면 observeSingleEvent가 올바른 Firebase 메소드를 사용하지 않을 수도 있습니다. 이 특정 경우에는 변경 사항을 관찰하고 싶지 않습니다. (이 목록은 자주 변경되지 않기 때문에) 데이터를 다운로드하고 나중에이 데이터로 다른 작업을해야합니다.

답변

4

Firebase는 비동기식이므로 코드가 정의 된 순서대로 실행되면 firebase가 데이터를 반환하도록 '대기'해야합니다.

Firebase 함수와 함께 사용되는 클로저는 데이터 (스냅 샷)가 유효 할 때 클로저 내의 코드를 실행합니다.

올바른 순서대로 실행됩니다 중포 기지 폐쇄 내에서에

이동 doSomethingHere() - listOfTags이 0 인 것처럼

if listOfTags.count != 0 { 
    for tag in listOfTags { 

     ref.child("tags").child(tag).observeSingleEvent(of: .value, with: { (snapshot) in 

      if let temp = snapshot.children.allObjects as? [FIRDataSnapshot] { 
       for elem in temp { 
        outputArray.append(elem.key) 
       } 
       doSomethingHere() //array is populated at this point 
      } 
     }) 
    } 
} 

참고하기이

if listOfTags.count != 0 

을 제거 할 수 있습니다이 경우 for 루프는 실행되지 않습니다.