2017-11-28 14 views
0

からです。私はPins = PinColorAnotationという配列を持っています.Pins.append(pinas)を呼び出してPins.countをプリントすると、常に0が得られます。なぜですか?しかし、print insideループを呼び出すと40と表示されます。問題は、Firebaseからダウンロードした後に、後でソートしてピンを管理する必要があるということです。しかし、私は傾ける。その問題を解決するには?このようなは、私はこのようなコードを持ってFirebase

ref.child("skelbimai").observeSingleEvent(of: .value, with: {(snapshot) in 

     for child in (snapshot.children.allObjects as? [DataSnapshot])!{ 

      let pinas = PinColorAnotation(color: UIColor.red) 
      pinas.coordinate = CLLocationCoordinate2D(latitude: child.childSnapshot(forPath: "lat").value as! Double, longitude: child.childSnapshot(forPath: "lon").value as! Double) 
      pinas.pinColor = Kategorija(child.childSnapshot(forPath: "cat").value as! Int).Color 
      pinas.title = String(Kategorija(child.childSnapshot(forPath: "cat").value as! Int).Name) 
      pinas.subtitle = String(child.childSnapshot(forPath: "price").value as! Double) 
      self.Map.addAnnotation(pinas) 
     } 

    }) 
+0

第1に、Firebaseデータは非同期であるため、データがいつ取り出されたかを知りたい場合は、完了ハンドラが必要です。第二に、いつマップ配列をインスタンス化していますか? – Paulo

答えて

1

何かが動作するはずです::私は、すべての管理ロジックを実行する必要がありますか、あなたがする必要がどこに

func getPins(completion: @escaping ([PinColorAnnotation]) -> Void){ 
    var data: [PinColorAnnotation] = [] 
    ref.child("skelbimai").observeSingleEvent(of: .value, with: {(snapshot) in 

    for child in (snapshot.children.allObjects as? [DataSnapshot])!{ 

     let pinas = PinColorAnotation(color: UIColor.red) 
     pinas.coordinate = CLLocationCoordinate2D(latitude: child.childSnapshot(forPath: "lat").value as! Double, longitude: child.childSnapshot(forPath: "lon").value as! Double) 
     pinas.pinColor = Kategorija(child.childSnapshot(forPath: "cat").value as! Int).Color 
     pinas.title = String(Kategorija(child.childSnapshot(forPath: "cat").value as! Int).Name) 
     pinas.subtitle = String(child.childSnapshot(forPath: "price").value as! Double) 
     self.data.append(pinas) 
    } 
    completion(data) 
}) 
} 

その後、viewDidLoadような、関数を呼び出します。返されたデータはself.map配列に設定できます。

コンピュータの近くにいないので、間違いがあると、お詫びします。タブレットで行われています。

+0

私は完了ハンドラについて知りませんでした.D –

+0

よろしくお願いします!それがうまくいったら、答えを正しいものとしてマークしてください。 – Paulo

関連する問題