用于检索Firebase数据的Swift服务类

时间:2017-02-17 14:27:58

标签: swift firebase service

我有一个服务类来从我的Firebase中获取数据:

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.Thus的值后才会获取Firebase中的数据,此值为nil。

2 个答案:

答案 0 :(得分:1)

这不是最好的解决方案,但它可以解决您的问题。

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                    
            }
        }
    }

答案 1 :(得分: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()
        })

    }