Ich lade derzeit Daten aus CloudKit ab und bearbeite die Tabellenansicht erfolgreich.Tabelle aktualisierenDaten anzeigen, nachdem neue Daten aus CloudKit abgerufen wurden
Ich habe eine Instanz, die erkennt, ob der Bildlauf in der letzten Zeile ist, und wenn dies der Fall ist, wird der Server neu in die Warteschlange gestellt, um weitere Daten abzurufen.
Nach dem Abrufen der gewünschten Daten, ich füge die spezifischen Elemente, bei bestimmten IndexPath, und dann lade ich die Tabellenansicht.
Was passiert ist, dass, wenn ich in der letzten Zeile bin, die tableView.reloadData()
meine App den Bildschirm flackert, aber alles funktioniert einwandfrei.
Nach wenigen Sekunden beginnt mein Debug den gleichen Fehler drucken, für jede Zelle, die ist:
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.
ich die heightForRowAtIndexPath wie diese Berechnung:
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;
}
Und mein Code zum Abrufen von Daten, sobald der Benutzer die letzte Zeile erreicht, ist folgender:
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)
}
}
Ich brauche Hilfe, um den Flimmerbildschirm zu vermeiden, wahrscheinlich verursacht durch die Funktion tableView.ReloadData(), und wie man diese Warnungen korrigiert, die nach ein paar Sekunden auftauchen.
Wenn ich die reloadData() -Methode nicht aufrufen, werden alle Zeilen hinzugefügt, aber der Bildlauf bewegt sich nicht, bleibt in der letzten Zeile hängen;
Danke.
Wäre es eine gute Option sein, durch die neuen Beiträge zu durchlaufen und auf dieser Iteration sie im Tableview einfügen und dann die Tableview Daten neu zu laden, alle asynchron ? –