В настоящее время я извлекаю данные из CloudKit и успешно заполняю таблицу.Обновить таблицуПросмотреть данные после получения новых данных из CloudKit
У меня есть экземпляр, который обнаруживает, что прокрутка находится в последней строке, и если да, то он повторно запускает сервер для получения большего количества данных.
После получения желаемых данных, успешно, я вставляю определенные элементы в определенный indexPath, а затем перезагружаю представление таблицы.
Что происходит, когда я в последней строке, tableView.reloadData()
заставляет мое приложение мерцать на экране, но все работает правильно.
Через несколько секунд мой отладки начинает печатать ту же ошибку, для каждой ячейки, которая:
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
Я расчета heightForRowAtIndexPath как это:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var cell = PostFeedTableViewCell()
cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.PostWithImage) as! PostFeedTableViewCell
return cell.bounds.size.height;
}
И мой код для извлечения данных после того, как пользователь достигает последней строки, является следующим:
func continueQuering(cursor: CKQueryCursor?) {
if cursor != nil {
self._loadingData = true
let publicData = CKContainer.default().publicCloudDatabase
let predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil)
let q = CKQuery(recordType: "Posts", predicate: predicate)
q.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let qop = CKQueryOperation(query: q)
qop.resultsLimit = 5
qop.cursor = cursor
qop.recordFetchedBlock = {(record) in
print("appending")
self.posts.append(record)
self.tableView.insertRows(at: [IndexPath.init(row: self.posts.count - 1, section: 0)], with: .automatic)
}
qop.queryCompletionBlock = { [weak self] (cursor : CKQueryCursor?, error : Error?) -> Void in
print("********************")
print("cursor = \(String(describing: cursor)) , error = \(String(describing: error))")
print("********************")
self?._Cursor = cursor
self?._loadingData = false
DispatchQueue.main.async {
print("reloading async ******")
self?.tableView.reloadData()
}
}
publicData.add(qop)
}
}
Мне нужна помощь в том, как избежать экрана мерцания, возможно, вызванного функцией tableView.reloadData(), и как исправить эти предупреждения, которые появляются через несколько секунд.
Если я не вызываю метод reloadData(), все строки добавляются, но свиток не перемещается, застревает в предыдущей последней строке;
Спасибо.
Будет ли это хороший вариант, чтобы перебирать новые должности и на этой итерации вставить их в Tableview, а затем перезагрузить данные Tableview, все асинхронно ? –