2017-03-24 1 views
0

イベントから現在地までの距離を計算し、結果をソートしてテーブルビューに入力しようとしています。オプションのアンラップされた値の距離がゼロのため、エラーが発生し続ける。swift 3現在地までの距離を計算し、クローゼットから結果を最も遠くにソート

 private func observeEvents() { 
    refHandle = ref.observe(.childAdded, with: { (snapshot) -> Void in 
     let eventDetails = snapshot.value as! Dictionary<String, AnyObject> 
     let eventID = snapshot.key 
     let location = eventDetails["location"] as! String! 

     //calculating distance 
     self.forwardGeocoding(address: location!) 
     let distance = self.eventLocation?.distance(from: self.currentLocation!) as Double! 
     //end calculating 

     let dateTime = eventDetails["dateTime"] as! String! 
     let addedByUser = eventDetails["addedByUser"] as! String! 
     let attending = eventDetails["attendance"] as! String! 
     if let name = eventDetails["eventName"] as! String! , name.characters.count > 0 
     { 

      self.events.append(Events(id:eventID, name: name, location: location!, dateTime: dateTime!, addedByUser: addedByUser!, attending: attending! , distance: distance!)) 
      self.events.sort(by: { $0.distance < $1.distance}) 

      self.tableView.reloadData() 
     } else { 
      print("Error ! Can't load events from database") 
     } 
    }) 
} //load events data to uitableview 

私はアドレス

 func forwardGeocoding(address: String) { 
    CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in 
     if error != nil { 
      print(error!) 
      return 
     } 
     if (placemarks?.count)! > 0 { 
      let placemark = placemarks?[0] 
      self.eventLocation = placemark?.location 
     } 
    }) 
} 

答えて

0

からCLLocationを返す関数を作成し、私は最終的に答えを考え出しました。問題は距離の関数が非同期的に呼び出され、結果が常にゼロになるということでした。 forwardGeocoding関数の補完ハンドラを作成し、アドレス文字列から緯度と経度を返し、ネストされたfirebaseリスナの中で結果を呼び出します。ここにコードがあります、誰かが私に似たような問題に遭遇して助けてくれれば幸いです。

//Get lat and long 

func getCoordinates(address: String, completionHandler: @escaping (_ lat: CLLocationDegrees?, _ long: CLLocationDegrees?, _ error: Error?) ->()) -> Void { 

    var _:CLLocationDegrees 
    var _:CLLocationDegrees 
    let geocoder = CLGeocoder() 
    geocoder.geocodeAddressString(address) { (placemarks: [CLPlacemark]!, error: Error!) in 

     if error != nil { 

      print("Geocode failed with error: \(error.localizedDescription)") 

     } else if placemarks.count > 0 { 

      let placemark = placemarks[0] as CLPlacemark 
      let location = placemark.location 

      let lat = location?.coordinate.latitude 
      let long = location?.coordinate.longitude 

      completionHandler(lat, long, nil) 
     } 
    } 
} 

firebaseリスナーでネストされたコール

refHandle = ref.observe(.childAdded, with: { (snapshot) -> Void in 
    let location = event["address"] as! String   
    self.getCoordinates(address: location!) { lat, long, error in 
      if error != nil { 
       print("Error") 
      } else { 
       self.latitude = lat 
       self.longitude = long 
       let distance = CLLocation(latitude: self.latitude!,longitude: self.longitude!).distance(from: self.currentLocation!) 

       if let name = eventDetails["eventName"] as! String! , name.characters.count > 0 
       { 

        self.events.append(Events(id:eventID, name: name, location: location!, dateTime: dateTime!, addedByUser: addedByUser!, attending: attending!, distance: distance)) 

        self.events.sort(by: { $0.distance < $1.distance}) 

        self.tableView.reloadData() 
       } else { 
        print("Error ! Can't load events from database") 
       } 

      } 
     } 
    }) 
関連する問題