2017-02-17 189 views
0

我有一個服務類從我的火力地堡提取數據:從火力地堡數據:斯威夫特服務類檢索火力地堡數據

class Service { 
    var myName = String? 
    var myDev: String? 

    func getData() { 
     let databaseRef = FIRDatabase.database().reference() 
     databaseRef.child("Data").observeSingleEvent(of: .value, with: { (snapshot) in 
      let value = snapshot.value as? NSDictionary 
      let name = value?["name"] as? String ?? "" 
      self.myName = name 
      let dev = value?["dev"] as? String ?? "" 
      self.myDev = dev 
     }) { (error) in 
      print(error.localizedDescription) 
     } 
    } 
} 

,並實現在我的主類:

var service = Service() 

override func viewDidLoad(){ 
    super.viewDidLoad() 
    service.getData() 
    configureLabel() 
} 

private func configureLabel(){ 
    self.titleLabel.text = service.myName 
    self.devLabel.text = service.myDev 
} 

的問題是隻有在我的標籤獲得myName和myDev的值後才提取。因此,此值爲零。

回答

0

當然是的。 getData()方法對Firebase服務進行異步調用。意思是,firebase的.observeSingleEvent方法與異步隊列中的大多數代碼塊一樣在服務調用中運行。因此,編譯器到達getData()行,將該塊推送到不同的隊列,並繼續編譯原始隊列中的下一行。如果您希望在收到響應後運行這些行,則可以將getData()方法的閉包作爲參數添加。

你可以做這樣的事情:

getData(completion:() -> Void) { 
     let databaseRef = FIRDatabase.database().reference() 
     databaseRef.child("Data").observeSingleEvent(of: .value, with: { (snapshot) in 
      let value = snapshot.value as? NSDictionary 
      let name = value?["name"] as? String ?? "" 
      self.myName = name 
      let dev = value?["dev"] as? String ?? "" 
      self.myDev = dev 

      completion() 
     }) { (error) in 
      print(error.localizedDescription) 
     } 
    } 

    override func viewDidLoad(){ 
     super.viewDidLoad() 
     service.getData(completion: { Void in 
      configureLabel() 
     }) 

    } 
+0

是的,它幫助。非常感謝! –

0

這不是最好的解決方案,但它應該可以解決您的問題。

struct MyStructure { 
     var name = "" 
     var dev = "" 

     init(with dictionary: [String: String]) { 
      if let name = dictionary["name"] { 
       self.name = name 
      } 
      if let dev = dictionary["dev"] { 
       self.dev = dev 
      } 
     } 
    } 

    class Service { 
     let databaseRef = FIRDatabase.database().reference() 

     func getData(completion: @escaping ((_ structure: MyStructure) -> Void)) { 
      databaseRef.child("Data").observeSingleEvent(of: .value, with: { snapshot in 
       if let value = snapshot.value as? [String: String] { 
        completion(MyStructure(with: value)) 
       } 
      }) { (error) in 
       print(error.localizedDescription) 
      } 
     } 
    } 

    let service = Service() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     service.getData { myStructure in 
      DispatchQueue.main.async { 
       self.titleLabel.text = myStructure.name 
       self.devLabel.text = myStructure.dev      
      } 
     } 
    } 
相關問題