Ниже у меня есть существующие загрузки запросов и ячейка для кода строки таблицы ...Slow CloudKit прокрутка таблицы - изменение существующего кода?
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!
}
Когда я запускаю этот код, приложение остается функциональным, но прокрутка ячеек таблицы 10 или так невероятно изменчивые. Я не уверен, что вызывает это - все записи, каждый из которых содержит изображение, загружаются во время загрузки запроса верхней функции. Тем не менее, проблема или концепция, которую я пропускаю, когда-либо присутствовали во время выполнения. Что мне здесь не хватает? Ленивая загрузка? кэш? что-то другое? На данный момент не уверен, поэтому любая помощь будет невероятно полезна.
Update 1:
Я обновил мой код с большим спасибо вы собираетесь Пирс. Мне пришлось немного обновить мой код из его ответа, чтобы сохранить массив ckrecord, чтобы перейти к другому контроллеру через - restaurantArray, но также создать новый массив для класса NSObject - tablerestaurantarray, который будет отображаться в текущем контроллере таблицы.
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!
}
Каждый раз, когда вы прокручиваете таблицу TableView, ваше приложение должно конвертировать 'CKAsset' в' Data', а затем конвертировать его в 'UIImage'.Я бы рекомендовал создать какой-то «NSObject», называемый «Ресторан» или что-то в этом роде, затем, когда вы выполняете свой запрос, возьмите каждую запись из массива «CKRecords» и проанализируйте ее в «Ресторане», который имеет 'UIImage' затем используйте изображения из этих объектов для заполнения ячеек. Таким образом, он просто должен захватить UIImage, а не конвертировать его каждый раз. – Pierce
Можете ли вы предоставить образец кода, Пирс? Мне никогда не приходилось работать с NSObjects в моих проектах, поэтому я немного отстаю от этого. – Jon
см. Мой ответ ниже – Pierce