2017-10-03 5 views
0

J'essaie de n'afficher que les annotations pour les emplacements les plus proches de mon utilisateur. J'ai tous les emplacements déjà enregistrés à Firebase et maintenant je suis juste en train de les récupérer et de remplir la Map et TableView avec seulement les emplacements autour de l'utilisateur. J'ai essayé GeoFire et quelques autres, mais je suis sûr que je ne fais pas bien. Quelqu'un pourrait-il aider?SEULEMENT Afficher les annotations pour les sites dans un rayon de

Db setup

override func viewDidLoad() { 
      super.viewDidLoad() 

      // Set up Map 
      mapView.delegate = self 
      mapView.userTrackingMode = MKUserTrackingMode.follow 

      // Setup TableView 
      tableView.delegate = self 
      tableView.dataSource = self 

      //Pulls TableData for UITableView 
      DataService.ds.REF_VENUE.observe(.value, with: { (snapshot) in 

       self.posts = [] // THIS IS THE NEW LINE 

       if let snapshot = snapshot.children.allObjects as? [DataSnapshot] { 
        for snap in snapshot { 
         if let postDict = snap.value as? Dictionary<String, AnyObject> { 
          let key = snap.key 
          let post = Post(postKey: key, postData: postDict) 
          self.posts.append(post) 
         } 

         //Populates Map with annotations. 
        if let locationDict = snap.value as? Dictionary<String, AnyObject> { 

         let lat = locationDict["LATITUDE"] as! CLLocationDegrees 
         let long = locationDict["LONGITUDE"] as! CLLocationDegrees 
         let title = locationDict["NAME"] as! String 
         let center = CLLocationCoordinate2D(latitude: lat, longitude: long) 
         _ = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.20, longitudeDelta: 0.20)) 

         let annotation = MKPointAnnotation() 
         annotation.coordinate = CLLocationCoordinate2DMake(lat, long) 
         annotation.title = title.capitalized 
         self.mapView.addAnnotation(annotation) 


         } 
        } 
       } 
       self.tableView.reloadData() 
      }) 
     } 

Voici comment configurer ma table:

func tableView (_ tableView: UITableView, section numberOfRowsInSection: Int) -> Int { retour posts.count }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if let cell = tableView.dequeueReusableCell(withIdentifier: "detailCell", for: indexPath) as? PostCell { 
    let cellData = posts[indexPath.row] 

    cell.configureCell(post: cellData) 
     return cell 
    } else { 
     return PostCell() 
    } 
} 



func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let post = posts[indexPath.row] 
    performSegue(withIdentifier: "previewSegue", sender: post) 
} 
+0

Épargnez-vous des valeurs lat et la longitude dans votre base de données de différents endroits? Si oui, vous pouvez faire votre résultat en utilisant des comparateurs comme obtenir toutes les données à la fois signifie tous les objets et maintenant définir une plage de la position actuelle de l'utilisateur et comparer cette portée aux objets dataSnapshot latitude et longitude et remplir les données –

+0

Non ils sont au même endroit . –

+0

J'ai mis à jour le code pour montrer comment je l'ai configuré –

Répondre

1

Comme mon emplacement est différent de votre emplacement. Je l'ai testé sur l'appareil et le résultat était comme la distance de mon emplacement et l'emplacement de votre site était d'environ 3K. donc vous pouvez utiliser ce fichier de code et le vérifier dans votre appareil, il aidera.

1) J'avais remplacé votre didload fonction pour l'instant comme un autre func et de l'appeler dans DidUpdateLocation des cartes

2) utilisés // iosGeek comme commentaire ci-dessus des lignes de code où j'inséré du code dans le fichier.

3) pour l'instant je ne suis pas peuplant des données sur la carte ou tableau à cause de l'emplacement différence

Link: https://drive.google.com/open?id=0Bz8kF1Gedr7fNThTbTFZY1Q3LVk 

Jetez un oeil à cette fonction dans votre FeedVc

1) S'il vous plaît tester sur un périphérique à obtenir la différence de localisation

2) emplacement d'impression dans la console pour vérifier si son entrée véritable

3) impression en self.postdata Si d'autre état pour vérifier ce qui est à venir en sortie

if snapshot.exists(){ 
     if let snapshot = snapshot.children.allObjects as? [DataSnapshot] { 
      for snap in snapshot { 

       //Here I just used your snapshot to filter data 
       self.postData = snap.value as! [String : AnyObject] 
       //calculating distance here with custom function made 
       let distance = self.calculateDistancxe(userlat: self.userLatt, userLon: self.userLonn, venueLat: self.postData["LATITUDE"]! as! CLLocationDegrees, venueLon: self.postData["LATITUDE"]! as! CLLocationDegrees) 
       //if Distance is less Than or equal to 2 km 
       let aa : Int = Int(distance)! 
       if (aa <= 2){ 

        //if yes , add *self.postData* in a new Dictionary or Array 

        print("*********\(self.postData)") 
        //time to use that postdata in a dict or array from which you will populate data in TableView 
       } 
       else{ 
        //if condition don't satisfy 
        print("noting \(distance)") 
       } 

      } 
     } 
    } 

Commentaire si elle est encore toute question se produit

+0

Je vais vérifier maintenant, –

+0

Malheureusement, cela n'a pas fonctionné. Aucune coordonnée n'a surgi. Donnez-moi des emplacements de test à utiliser et je les mettrai. –

+0

Je n'avais pas renseigné de données dans votre tableViewView Array utilisé Je viens juste d'écrire du code qui va produire des résultats et vous devez l'utiliser en ajoutant un tableau et remplir tableau à TableView, obtenir mon point ou je devrais modifier du code pour plus de référence? –