类和函数中的Swift完成处理程序

时间:2018-05-27 13:43:31

标签: swift google-cloud-firestore

我有一个带有连接到firestoreDB并获取一些数据的函数的类:

if (FormatChecker.canParseDouble(realConstant)) {
   test = Double.parseDouble(realConstant);
   out.println(test);
} 

在我的ViewController中我调用了这个函数。

import UIKit
import CoreLocation
import Firebase

private let _singletonInstance = GetBottlesFromDB()

class GetBottlesFromDB: NSObject {

    class var sharedInstance: GetBottlesFromDB { return _singletonInstance }

    var Pins = [LayoutBottlesFromDB]()

    // MARK: - init
    override init() {
        super.init()
        populatePinList(completion: { pin in self.Pins } )
        //print("GET ALL PINS: \(Pins)")
    }


    func populatePinList(completion: @escaping ([LayoutBottlesFromDB]) -> ()) {

        Pins = []

        AppDelegate.ADglobalVar.db.collection("Bottles").whereField("pickupuser", isEqualTo: NSNull()).getDocuments { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {

                print("start getting documents:")
                for document in querySnapshot!.documents {
                    //print("\(document.documentID) => \(document.data())")
                    //print("\(document.documentID)")

                    let bottleID:String  = document.documentID
                    let bottlekind:Int = document.data()["bottle"] as! Int
                    var bottletitel:String
                    var bottlesub:String
                    var bottleurl:String = (document.data()["pic"] as? String)!


                    let pin = LayoutBottlesFromDB(document.data()["lat"] as! CLLocationDegrees, document.data()["long"] as! CLLocationDegrees, ID: bottleID, title: bottletitel, subtitle: bottlesub, type: bottlekind, url:bottleurl)

                    //print("GET DAATA from DB: \(pin)")
                    self.Pins.append(pin)

                } //for
                completion(self.Pins)
            } //else
        } //querysnap
    }//function
}//class

我的问题是该函数将被调用但打印为空。 该功能不等待完成。我做错了什么?

2 个答案:

答案 0 :(得分:0)

您正在直接致电GetBottlesFromDB.sharedInstance.Pins,这不会等到populatePinList方法的完成,这就是为什么您变得空白所以您需要等待完成或者您可以检查是否有数据在引脚变量中不可用,你需要像这样调用完成方法:

GetBottlesFromDB.sharedInstance.populatePinList { (pins) in
            for pin in pins{
                print("Add Pin : \(pin)")
            }
      }

答案 1 :(得分:0)

您的代码中没有任何内容等待异步方法的执行,因此毫不奇怪。此外,这将是一个糟糕的设计,因为它会阻止你的应用程序。此外,您的单身实施过于冗长,并不能保证它保持单身,所以我建议将其更改为

class GetBottlesFromDB {

    private(set) var Pins = [LayoutBottlesFromDB]()

    static let shared = GetBottlesFromDB()

    private init() {}

    // populatePinList as before
}

并在您的视图控制器中,例如在viewDidLoad执行:

override func viewDidLoad() {
    GetBottlesFromDB.shared.populatePinList { pins in
        pins.forEach { print("Add Pin: \(pin)") }
    }
}