То, что я пытаюсь сделать, это организовать свои ячейки по магазину, ближайшему к моему текущему местоположению, используя Geopoint в Cloud Firestore.
Я просмотрел весь стек, но не могу найти, как настроить просмотр таблицы вViewController для отображения ближайшего ко мне цветочного магазина из моего текущего местоположения с использованием геопункта в Cloud Firestore
. Это то, что мне нужно в настоящее время для настройки данных для передачи в VC, чтобы они организовывали данные из Firestore в хранилища. ближайший к моему текущему местоположению
ниже у меня есть изображение коллекции в моем Firestore и изображение моего ViewController для того, как мое приложение настроено
import Foundation
import UIKit
class Store {
var id: String
var storeName: String
var imageUrl: String
var location: ??
init(id: String,
storeName: String,
imageUrl: String,
location:??) { //
self.id = id
self.storeName = storeName
self.imageUrl = imageUrl
self.location = location //
}
convenience init(dictionary: [String : Any]) {
let id = dictionary["id"] as? String ?? ""
let storeName = dictionary["storeName"] as? String ?? ""
let imageUrl = dictionary["imageUrl"] as? String ?? ""
let location = dictionary["location"] as? String ?? "" //
self.init(id: id,
storeName: storeName,
imageUrl: imageUrl,
location: location) //
}
}
import UIKit
import SDWebImage
import Firebase
class StoreCell: UITableViewCell {
weak var stores: Store!
@IBOutlet weak var imageUrl: UIImageView!
@IBOutlet weak var storeName: UILabel!
func configure(withStore stores: Store) {
storeName.text = product.dispensaryName
productImage.sd_setImage(with: URL(string: product.imageUrl))
}
override func layoutSubviews() {
super.layoutSubviews()
}
}
import UIKit
import CoreLocation
import Firebase
import FirebaseFirestore
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager: CLLocationManager?
@IBOutlet weak var tableView: UITableView!
var stores: [Store] = []
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestWhenInUseAuthorization()
tableView.dataSource = self
tableView.delegate = self
fetchStores { (stores) in
self.stores = stores
self.tableView.reloadData()
}
}
func fetchStores(_ completion: @escaping ([Store]) -> Void) {
let ref = Firestore.firestore().collection("storeName")
ref.addSnapshotListener { (snapshot, error) in
guard error == nil, let snapshot = snapshot, !snapshot.isEmpty else {
return
}
completion(snapshot.documents.compactMap( {Store(dictionary: $0.data())} ))
}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse {
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self){
if CLLocationManager.isRangingAvailable() {
// do Stuff
}
}
}
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return stores.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "StoreCell") as?
StoreCell else { return UITableViewCell() }
cell.configure(withStore: stores[indexPath.row])
return cell
}
}