Object = nil после метода запроса firebase - PullRequest
0 голосов
/ 10 мая 2019

Я использую базу данных Firebase в реальном времени.Я запрашиваю данные и помещаю их в объект, который я создал с помощью цикла For, но если я хочу использовать объект после метода запроса, это nul.Вот код и увидеть комментарии, какие-либо предложения?

Я пытаюсь использовать "class", "struct" и "init"

var StockOb : [StockModel2] = []
var tempstock : [StockModel2] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        self.StockOb = [StockModel2]()
        self.tempstock = [StockModel2]()
}
func getdata() 
{
    let ref = Database.database().reference()

        ref.child("MyStock").observe(.value) { (snapchot) in

            let AllStock = snapchot.value as! NSDictionary



            for (key,_) in AllStock {

                let ab = StockModel2()
                let OneStock:NSObject = AllStock[key] as! NSObject
                ab.name = OneStock.value(forKey: "name") as? String
                ab.quan = OneStock.value(forKey: "quan") as? Int
                ab.price = OneStock.value(forKey: "price") as? Int
                ab.total = OneStock.value(forKey: "total") as? Int







                self.StockOb.append(ab)
            }
            /// here it's ok 
            print("[+] iside firebase method = \(self.StockOb[0].price!)")
            self.tempstock = self.StockOb
        }
        /// here it's nil
        print(self.tempstock[0].name) // nil
        print(self.StockOb[0].name) // nil
}

Это мой объект:

class StockModel2 : NSObject{
    var name :String!
    var quan : Int!
    var price : Int!
    var total : Int!


}

Я хочу использовать свой объект в любом месте, после того как добавлю его в «self.StockOb» или «self.tempstock»

1 Ответ

0 голосов
/ 10 мая 2019

Здесь

/// here it's nil
print(self.tempstock[0].name) // nil
print(self.StockOb[0].name) // nil

вы получаете доступ к переменным вне колбэка firebase, поэтому вы получите сбой

func getdata() {

    let ref = Database.database().reference() 
        ref.child("MyStock").observe(.value) { (snapchot) in

            let allStock = snapchot.value as! [String:[String:Any]]  
            Array(allStock.values).forEach { 
                let ab = StockModel2() 
                ab.name = $0["name"] as! String
                ab.quan = $0["quan"] as! Int
                ab.price = $0["price"] as! Int
                ab.total = $0["total"] as! Int 
                self.stockOb.append(ab)
            } 

            self.tempstock = self.stockOb 

        /// here it's not nil
        print(self.tempstock[0].name) // here
        print(self.stockOb[0].name) // here
    }
} 

Также вам не нужно писать это внутри viewDidLoad

self.stockOb = [StockModel2]()
self.tempstock = [StockModel2]()

потому что они инициированы в объявлении здесь

var stockOb : [StockModel2] = []
var tempstock : [StockModel2] = []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...