2017-10-06 2 views
-1

아래에 표시된 방법을 사용하여 firebase에서 데이터를 가져 와서 배열에 넣으려고합니다. 제안 된 것처럼 오류 완료 처리기를 사용할 때 배열 데이터에 Data 값을 할당합니다. Locdata 가져 오기 기능은 맨 아래에 있습니다.기능이 반환되지 않습니다. Swift Firebase

import UIKit 
import Firebase 
class SearchSelectVC: UIViewController, UIPickerViewDelegate , UIPickerViewDataSource{ 

    @IBOutlet weak var locationPicker: UIPickerView! 
    @IBOutlet weak var humidityPicker: UIPickerView! 
    @IBOutlet weak var datePicker: UIPickerView! 
    @IBOutlet weak var locationLB: UILabel! 
    @IBOutlet weak var humidityLB: UILabel! 
    @IBOutlet weak var dateLB: UILabel! 

    var locData: [String] = [String]() 
    var humidityData : [String] = [String]() 
    var dateData : [String] = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // initPickers() 
     humidityPicker.delegate = self 
     humidityPicker.dataSource = self 
     locationPicker.delegate = self 
     locationPicker.dataSource = self 
     datePicker.delegate = self 
     datePicker.dataSource = self 
     //locData = [ "hi" , "hi2 ","hi3","hi4", "hi5", "hi6", "hi7"] 
     //dateData = [ "no" , "no2 ","no3","no4", "no5", "no6", "no7"] 
     //humidityData = [ "yes" , "yes2 ","yes3","yes4", "yes5", "yes6", "yes7"] 
     //datePicker.isHidden = true 
     //locationPicker.isHidden = true 
     //humidityPicker.isHidden = true 
     getLoc(onCompletion: { (data) in 
      print(data) 
      self.locData = data 
     }, onError: { (error) in 
     }) 
     print(locData) 
    } 

    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     if(pickerView == locationPicker){ 
      return 1 
     } 
     else if(pickerView == datePicker){ 
      return 1 
     } 
     else if(pickerView == humidityPicker){ 
      return 1 
     } 
     return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     if (pickerView == locationPicker) { 
      return locData.count 
     } 
     else if (pickerView == humidityPicker){ 
      return humidityData.count 
     } 
     else if (pickerView == datePicker) { 
      return dateData.count 
     } 
     return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     if (pickerView == locationPicker) { 
      return locData[row] 
     } 
     else if(pickerView == datePicker){ 
      return dateData[row] 
     } 
     if(pickerView == humidityPicker){ 
      return humidityData[row] 
     } 
     return "thisisbad" 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    { 
     if(pickerView == locationPicker){ 
      updateLabelLoc() 
      getDate(onCompletion: { (data) in 
       print(data) 
       self.dateData = data 
      }, onError: { (error) in 
      }) 
     } 
     else if(pickerView == datePicker){ 
      updateLabelDate() 
      getHumidity(onCompletion: { (data) in 
       print(data) 
       self.humidityData = data 
      }, onError: { (error) in 
      }) 
     } 
     else if(pickerView == humidityPicker){ 
      updateLabelHumidity() 
     } 
    } 
    func updateLabelLoc(){ 
     let location = locData[locationPicker.selectedRow(inComponent: 0)] 
     locationLB.text = location 
    } 
    func updateLabelDate(){ 
     let date = dateData[datePicker.selectedRow(inComponent: 0)] 
     dateLB.text = date 
    } 
    func updateLabelHumidity(){ 
     let humidity = humidityData[datePicker.selectedRow(inComponent: 0)] 
     humidityLB.text = humidity 
    } 
    func getDate(onCompletion: @escaping (Array<String>) -> Void, onError: @escaping (NSError) -> Void) { 
     var data : [String] = [] 
     let selectedLoc = locationLB.text 
     var dateRef: DatabaseReference! 
     dateRef = Database.database().reference().child("launch").child((selectedLoc)!) 
     dateRef.observeSingleEvent(of: .value, with: { (snapshot) in 
      for child in snapshot.children { 
       let snap = child as! DataSnapshot 
       let key = snap.key 
       data.append(key) 
       print("date = \(key)") 
       print(data) 
       onCompletion(data) 
      } 
     }) 
    } 
    func getLoc(onCompletion: @escaping (Array<String>) -> Void, onError: @escaping (NSError) -> Void){ 
     var data : [String] = [] 
     var locRef: DatabaseReference! 
     locRef = Database.database().reference().child("launch") 
     locRef.observeSingleEvent(of: .value, with: { (snapshot) in 
      for child in snapshot.children { 
       let snap = child as! DataSnapshot 
       let key = snap.key 
       data.append(key) 
       print("location = \(key)") 
       print(data) 
       onCompletion(data) 
      } 

     }) 
    } 
    func getHumidity(onCompletion: @escaping (Array<String>) -> Void, onError: @escaping (NSError) -> Void){ 
     var data : [String] = [] 
     let selectedLoc = locationLB.text 
     let selectedDate = dateLB.text 
     var humidityRef: DatabaseReference! 
     humidityRef = Database.database().reference().child("launch").child((selectedLoc)!).child((selectedDate)!) 
     humidityRef.observeSingleEvent(of: .value, with: { (snapshot) in 
      for child in snapshot.children { 
       let snap = child as! DataSnapshot 
       let key = snap.key 
       data.append(key) 
       print("humidity = \(key)") 
       print(data) 
       onCompletion(data) 
      } 
     }) 
    } 
    func initPicker(onCompletion: @escaping (Array<String>) -> Void, onError: @escaping (NSError) -> Void){ 
     humidityPicker.delegate = self 
     humidityPicker.dataSource = self 
     locationPicker.delegate = self 
     locationPicker.dataSource = self 
     datePicker.delegate = self 
     datePicker.dataSource = self 
    } 
} 

올바르게 할당하고 있는지 확실하지 않지만 locData를 인쇄하려고하면 아무 일도 일어나지 않습니다. 또한 내 UIPickerViews 프로그램을 실행할 때 나타나지 않습니다.

func getDate(onCompletion: @escaping ([String]) -> Void) { 
    var data : [String] = [] 
    let selectedLoc = locationLB.text 
    var dateRef: DatabaseReference! 
    dateRef = Database.database().reference().child("launch").child((selectedLoc)!) 
    dateRef.observeSingleEvent(of: .value, with: { (snapshot) in 
     for child in snapshot.children { 
      let snap = child as! DataSnapshot 
      let key = snap.key 
      data.append(key) 
      print("date = \(key)") 
      print(data) 
      onCompletion(data) 
     } 
    }) 
} 

가 전화를 걸려면 :

getDate(onCompletion: { (data) in 
    print(data) 
} 
+0

당신은 사용해야 당신이 방법이 완료되면 호출 될 것이다 함수 getDatecompletionHandler을해야하므로 – koropok

답변

0

observeSingleEvent

는 비동기 호출입니다 완료 핸들러. 오히려 배열을 리턴한다. 데이터가 추가되기 전에 데이터를 반환하기 시작했습니다.
+0

오류를 어떻게 추가합니까? 죄송합니다, Im 신속한 새로운. –

+0

@RohanRao, 그 전화에 대해 읽었습니다. 오류 부분이 필요하다고 생각하지 않아서 제거했습니다. 또한'completionHandler' 대신에'return [String]'을 수행하십시오. 실제로 받아 들일 수는 없으며 대답을 취소 한 다음 받아 들여 삭제하고 질문을 업데이트하십시오. 대신 새로운 질문을해야합니다. –

+0

@RohanRao, 아마도 1 질문/ –

관련 문제