iOS-11 UITableView performBatchUpdates Abschluss Schließung nicht genannt

Ich habe eine UITableView die Anzeige aggregierter feed der Beiträge, die aus mehreren RSS-feeds. Wenn meine app zieht neue Beiträge aus einem feed erstelle ich ein Objekt für alle notwendigen Insertionen und Deletionen benötigt, um zu aktualisieren, die UITableView aktuellen Zeilen. Ich Stelle diese Objekte in ein array, welches ich als eine FIFO-Warteschlange. Alle paar Sekunden, ich ziehe das erste element aus diesem array und versuchen, führen Sie alle Einfügungen und Löschungen innerhalb der UITableView mit der Funktion UITableView:performBatchUpdates.

Diesem funktioniert alles Super … so lange der Benutzer nicht scrollen UITableView oben und unten. Wenn es scrollen geht, werden die updates nicht mehr, denn ich bin kein flag gesetzt, um sicherzustellen, dass ich immer warten, bis der Letzte Satz von Einfügungen/Löschungen abgeschlossen hat, bevor ich die nächste Ladung, und leider, manchmal, die Fertigstellung Schließung von UITableView:performBatchUpdates wird nie aufgerufen, daher meine fahne ist nie gelöscht.

Hier ist der code, den ich bin mit der Bearbeitung meiner eingehenden Warteschlange der änderungen, die für die UITableView:

@objc func updateFeedPostsTableView() {

    guard feedUpdateQueue.count > 0,
          !feedTableUpdateInProgress else { return }

    feedTableUpdateInProgress = true
    let feedUpdate = feedUpdateQueue.first!
    feedUpdateQueue.remove(at: 0)

    self.aggregatedRSSFeed = feedUpdate.feed

    self.feedPostsTableView.performBatchUpdates ({
        self.feedPostsTableView.deleteRows(at: feedUpdate.indexPathsOfDeletedPosts,
                                           with: .fade)
        self.feedPostsTableView.insertRows(at: feedUpdate.indexPathsOfNewPosts,
                                           with: .top)
        },
        completion: { (success) in
            self.feedTableUpdateInProgress = false
        }
    )
}

Meine Frage ist, warum würde UITableView.performBatchUpdates einmal ausfallen zu nennen, dessen Fertigstellung blockieren? Was mache ich hier falsch?

Dies ist iOS 11.2, mit Xcode version 9.2.

Dank!

  • Update: Das wird noch schlimmer. Ich habe versucht Ersatz für meinen test !feedTableUpdateInProgress stattdessen untersuchen Sie die Anzahl der Zeilen, die derzeit in der UITableView, die besser zu entscheiden, ob ich sollte mit den nächsten updates. Ach, die Gesamtanzahl der Zeilen nicht immer, schließlich hinzufügen, bis die Anzahl der Zeilen, die meine app angefordert hat, eingefügt werden.
  • ist Ihre app abstürzt? Ich denke, app abgestürzt ist, wenn Sie nur deleteRows, während das entfernen nicht vom array selbst
  • Nein, die app wird nicht Abstürzen; ich habe berechnet, die arrays von Deletionen und Insertionen richtig. In der Tat, entfernte ich alle löschen, als ein test, und es stellt sich heraus, dass die Zeile Einfüge, werden nie ausgeführt, wenn der tableview wird gescrollt durch den Benutzer.
  • können Sie teilen mir Ihre vollständige code? so kann ich starten Sie es über hier-und-test
  • Für Einfaches UITableView, es funktioniert in meinem code 🙂 bitte geben Sie den code, so kann ich starten Sie es über hier-und-test
InformationsquelleAutor Greg Anderson | 2018-05-22



One Reply
  1. 1

    Ich wurde mit diesem problem. Die wichtigsten performBatchUpdates block immer ausgeführt, aber die Fertigstellung block wurde nie genannt. Ich fand heraus, dass das Problem verursacht wurde von mir mit Hilfe einer Unterklasse von UITableView. Sobald ich wieder eingeschaltet, um ein Vanille – UITableView das problem ging Weg.

    Lektion gelernt. Nicht Unterklasse UITableView.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.