/ / Triediť UITableView s dvojitým - rýchlym, firebase, firebase-databázou

Zoradiť UITableView s dvojitou databázou - swift, firebase, firebase

Snažím sa vytvoriť UITableView, ktorý je zoradenýo veľkosť hodnoty zemepisnej šírky nájdenej v databáze. Aj keď moje bunky UITable zobrazujú všetky názvy obchodov a konzola tlačí na zemepisnú šírku, stále nemôžem zistiť, ako zoradiť bunky podľa ich vlastnej hodnoty zemepisnej šírky. Tu je môj aktuálny kód:

@IBOutlet weak var nearbyTableView: UITableView!
var myList: [String] = []
var handle:DatabaseHandle?
var ref:DatabaseReference?


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

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

let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
var (cellName) = myList[indexPath.row]
cell.textLabel?.text = cellName
return cell

}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
var (cellName) = myList[indexPath.row]

let viewController = self.storyboard?.instantiateViewController(withIdentifier: "Home2") as! ShopViewController
viewController.name = cellName
self.present(viewController, animated: true, completion: nil)
navigationController?.pushViewController(viewController, animated: true)

print("row(indexPath.row)")
print("name: (cellName)")
}




override func viewDidLoad() {
super.viewDidLoad()

let messageDB = Database.database().reference().child("shops")

messageDB.observe(.childAdded, with: { snapshot in

let snapshotValue = snapshot.value as! NSDictionary
let text = snapshotValue["name"] as! String
let lat = snapshotValue["lat"] as! Double

print(text)
print(lat)

self.myList.append(text)
self.nearbyTableView.reloadData()
})

}

}

odpovede:

0 pre odpoveď č. 1

Zdá sa, že problémom je, že sa pripájatekaždý nový prvok na konci zdroja údajov (myList). Jednou z možných možností by bolo zmeniť myList tak, aby obsahoval aj hodnotu lat (napr. Pomocou n-tice (String, Double), a vložiť každý nový prvok pred prvý existujúci prvok, ktorý má lat väčší ako svoj vlastný. Takže napríklad ak ste už mali existujúci myList

var myList: [(String, Double)] = [("Name1", 0.1), ("Name2", 0.2), ("Name4", 0.4)]

potom môžete pridať nový prvok prehľadaním príslušného indexu a vložením do tohto indexu, napríklad takto

let myNewElement: (String, Double) = ("Name3", 0.3)

if let insertionIndex = myList.index(where: {myNewElement.1 <= $0.1}) {

myList.insert(myNewElement, at: insertionIndex)
}

// myList = [("Name1", 0.1), ("Name2", 0.2), ("Name3", 0.3), ("Name4", 0.4)]

potom by sa malo priradenie vo vašom cellForRowAt: zmeniť, napríklad takto:

cell.textLabel?.text = myList[indexPath.row].0