Im Folgenden werde ich meine vorhandene Abfrage herunterladen und Zelle für Tabellenzeile Code haben ...Verlangsamen CloudKit-Tabellendurchlauf - bestehenden Code ändern?
publicDB.perform(query, inZoneWith: nil)
{
(results, error) -> Void in
if (error != nil)
{
self.present(alert, animated: true, completion: nil)
}
else
{
for result in results!
{
self.restaurantArray.append(result)
}
OperationQueue.main.addOperation({() -> Void in
self.tableView.reloadData()
}) } }}
downloadRestaurants()
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "restaurantcell") as? RestaurantTableCell
let restaurant: CKRecord = restaurantArray[indexPath.row]
cell?.name?.text = restaurant.value(forKey: "Name") as? String
let asset = restaurant.value(forKey: "Picture") as! CKAsset
let data = try! Data(contentsOf: asset.fileURL)
_ = UIImage(data: data)
cell?.picture?.image = UIImage(data: data)
return cell!
}
Wenn ich diesen Code ausführen, die App bleibt funktionsfähig, aber Scrollen durch die 10 oder so Tabellenzellen ist unglaublich abgehackt. Ich bin mir nicht sicher, was das verursacht - alle Datensätze, die jeweils ein Bild enthalten, werden während des Abfrage-Download-Teils der obersten Funktion heruntergeladen. Ein Problem oder ein Konzept, das ich vermisse, ist jedoch während der Laufzeit immer vorhanden. Was fehlt mir hier? Faules Laden? Zwischenspeicher? etwas anderes? Ich bin zu diesem Zeitpunkt nicht sicher, also wäre jede Hilfe unglaublich hilfreich.
Update 1:
Ich habe meinen Code mit einem großen aktualisiert danke zu Pierce gehen. Ich musste meinen Code ein wenig von seiner Antwort aktualisieren, um ein ckrecord-Array zu pflegen, um über - restaurantArray zu einem anderen Controller zu wechseln, aber auch ein neues Array für den NSObject-Klassen-Tablerestaurantarray zu erstellen, der im aktuellen Tabellen-Controller angezeigt wird.
var restaurantArray: Array<CKRecord> = []
var tablerestaurantarray: [Restaurant] = []
for result in results!
{
let tablerestaurant = Restaurant()
if let name = result.value(forKey: "Name") as! String? {
tablerestaurant.name = name
}
// Do same for image
if let imageAsset = result.object(forKey: "Picture") as! CKAsset? {
if let data = try? Data(contentsOf: imageAsset.fileURL) {
tablerestaurant.image = UIImage(data: data)
}
}
self.tablerestaurantarray.append(tablerestaurant)
self.restaurantArray.append(result)
}
OperationQueue.main.addOperation({() -> Void in
self.tableView.reloadData()
})
}
}
}
downloadRestaurants()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return restaurantArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "restaurantcell") as? RestaurantTableCell
let restaurant: Restaurant = tablerestaurantarray[indexPath.row]
cell?.name?.text = restaurant.name
cell?.picture?.image = restaurant.image
return cell!
}
Jedes Mal, wenn Sie in Ihrem TableView blättern, muss Ihre App einen 'CKAsset' in' Data' umwandeln und diesen in einen 'UIImage' konvertieren.Ich würde empfehlen, eine Art 'NSObject' namens 'Restaurant' oder so etwas zu erstellen, dann, wenn Sie Ihre Abfrage durchführen, nehmen Sie jeden Datensatz aus dem Array von' CKRecords' und parsen ihn in ein 'Restaurant'-Objekt, das ein' UIImage' hat property, verwenden Sie dann die Bilder dieser Objekte, um die Zellen zu füllen. Auf diese Weise muss es nur ein UIImagage greifen, anstatt es jedes Mal umzuwandeln. – Pierce
Wären Sie in der Lage, ein Codebeispiel zu liefern, Pierce? Ich musste nie zuvor mit NSObjects in meinen Projekten arbeiten, daher bin ich ein bisschen zurück. – Jon
Bitte sehen Sie meine Antwort unter – Pierce