2017-12-19 4 views
0

제목에 Firebase에서 간단한 데이터를 검색하는 데 이상한 문제가 있지만 실제로 어디로 잘못 될지 알 수 없습니다.Swift를 사용하여 Firebase에서 데이터를 검색 할 수 없습니다.

이 내 스키마입니다 :

enter image description here

그리고이 코드 :

import Firebase 

let DB_BASE = Database.database().reference() 

class FirebaseService { 

    static let instance = FirebaseService() 

    private var REF_BASE = DB_BASE 
    private var REF_SERVICE_STATUS = DB_BASE.child("Service_Status") 

    struct ServiceStatus { 
     var downloadStatus: Bool 
     var uploadStatus: Bool 
    } 

    func getServiceStatus() -> (ServiceStatus?) { 
     var serviceStatus: ServiceStatus? 

     REF_SERVICE_STATUS.observeSingleEvent(of: .value) { (requestSnapshot) in 

      if let unwrapped = requestSnapshot.children.allObjects as? [DataSnapshot] { 
       for status in unwrapped { 
        serviceStatus.downloadStatus = status.childSnapshot(forPath: "Download_Status").value as! Bool 
        serviceStatus.uploadStatus = status.childSnapshot(forPath: "Upload_Status").value as! Bool 
       } 
       // THANKS TO JAY FOR CORRECTION 
       return sponsorStatus 
      } 
     } 
    } 
} 

하지만 마지막에 serviceStatus는 무기 호입니다. 어떤 충고?

+0

에서이 링크를 확인 항상있다. 이 경우 Firebase 함수의 코드가 서버에서 데이터를 반환하기 전에 반환이 실행됩니다. Firebase는 비동기식이므로 코드를 작성해야합니다. [다운로드 후 조치] (https://stackoverflow.com/questions/43027817/how-to-perform-an-action-only-after-data-are-downloaded-from-firebase/43029121#43029121) 및 [Firebase 비동기 작업] (https://stackoverflow.com/questions/38550634/swift-firebase-return-in-asynchron-task/38551937#38551937) – Jay

+0

@Jay 감사합니다. 문제는 serviveStatus가 실제로 nil입니다. ! 데이터를 검색하는 데 잘못된 것이 있습니까? – user3582537

답변

0

여러분이 좀 더 관리하기 쉽게 코드를 단순화 할 수있을 것이라고 생각합니다. 시도해보십시오

let ssRef = DB_BASE.child("Service_Status") 
ssRef.observeSingleEvent(of: .value) { snapshot in 
    let dict = snapshot.value as! [String: Any] 
    let down = dict["Download_Status"] ?? false 
    let up = dict["Upload_Status"] ?? false 
} 

?? 노드가 nil (즉, 존재하지 않음) 인 경우 down 및 up vars에 기본값을 false로 지정합니다.

오 - Firebase 비동기 호출 (클로저)에서 데이터를 반환하려고하면 실제로 작동하지 않습니다 (그대로).

정상 함수는 코드를 동 기적으로 전파 한 다음 호출 함수에 값을 반환하므로 호출 함수가 다음 코드 행으로 진행된다는 점에 유의하십시오.

은 즉시 당신이 당신의 중포 기지 함수를 호출로, 코드가 행복하게 중포 기지 전에 다음 줄 로 이동하는 것입니다 서버에서 데이터를 얻을 및 반환 VAR을 채울 수있는 기회가있다. 다른 말로하면 -하지 마십시오.

대안은 그래서 * 반환 *이 제대로 사용되지

Run code only after asynchronous function finishes executing