2017-11-28 11 views
0

에서 얻었다. 나는 Pins = PinColorAnotation 배열을 가지고 있는데, Pins.append (pinas)를 호출하고 Pins.count를 출력 할 때 나는 항상 0을 얻는다. 왜 그럴까? 하지만 루프 내부에서 print를 호출하면 40이라고 표시됩니다. 문제는 내가 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

첫째, Firebase 데이터는 비동기식이므로 데이터를 언제 검색했는지 알고 싶으면 완료 핸들러가 필요합니다. 두 번째로 언제 Map 배열을 인스턴스화합니까? – 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