Vollbild-Tabellenansicht iPad-App. Ich habe Swipe zum Löschen auf meinen Zeilen aktiviert. Die Zeilenanimation endet immer nach dem Löschen (commitEditingStyle wird abgeschlossen), aber gelegentlich wird die gesamte Tabellenansicht eingefroren. Nicht die ganze Benutzeroberfläche, wohlgemerkt, es ist kein blockierter Haupt-Thread. Ich kann auf eine Spaltenüberschrift tippen oder auf die Zurück-Schaltfläche auf dem Navigationscontroller tippen, aber die Tabelle selbst wird gesperrt und kann nicht kopiert werden. Ich kann es einfach aufheben, indem ich auf einen meiner Spaltenkopf-Buttons tippe.
Ich bin einfach völlig ratlos für das, was den Einfrieren verursachen könnte. Ich verwende einen NSFetchedResultsController und hier ist mein Delegate-Code dafür. Es ist ein hübscher Boiler-Teller ( Update : nicht als Kesselplatte jetzt. Mit einem Batch-Ansatz):
%Vor%Das Löschen wird in der Delegiertenmethode didChangeObject aufgerufen, technisch gesehen ist es jedoch kein echtes Löschen. Ich setze einfach eine Eigenschaft auf -1 und speichere dann dieses Element durch den NSMangagedObjectContext - zu diesem Zeitpunkt scheint die NSFRC das Richtige zu tun, was sie aus der Liste der abgerufenen Objekte entfernt, die mit diesem Prädikat abgerufen wurden:
%Vor% Dabei ist account
ein gültiges kontoverwaltetes Objekt. Die Zeile verschwindet ohne ein Problem 90% oder mehr der Zeit. Es ist nur gelegentlich, dass nach dem Abschluss der Animation der Tisch in dem von mir beschriebenen Herrenhaus zufriert. Es friert niemals ein, wenn die Lösch-Schaltfläche noch angezeigt wird, also weiß ich, dass es nach dem Aufruf von commitEditingStyle aufgerufen wird. Die Schaltfläche Löschen verfügt nicht über eine benutzerdefinierte Implementierung. Dies ist die standardmäßige UITableView-Implementierung von Swipe zum Löschen. Hier ist meine Methode commitEditingStyle:
Sie können hier ein Video sehen, von dem ich rede. Es ist mehr als zwei Minuten, also wollen Sie vielleicht nicht die ganze Sache sehen, aber ich werde es hier als Referenz setzen.
Ich würde gerne irgendwelche Vorschläge hören.
Aktualisieren
Ich habe die NSFRC-Delegatmethoden aktualisiert, um einen Stapelansatz zu verwenden, um sicherzustellen, dass die Aktualisierungen auf einmal angewendet werden. Dies hat das Problem nicht behoben. Der Tisch friert immer noch periodisch.
Ich habe auch über dieses Problem raten. Meine Idee ist, dass controllerDidChangeContent
doppelt oder mehrmals und schneller als Tabellenaktualisierungen aufgerufen werden kann und diese Ursache für mehrere Aufrufe von tableView.beginUpdates()
, die Tabelle aufhängen können.
Um dies zu beheben, empfehle ich die Aktualisierung in dispatch_async
block oder einfach boolesches Flag
Blöcke verwenden.
Es ist mir unklar, auf welchen Thread der MOC zugegriffen wird, aber da Sie fetchedResultsController
verwenden, ist es wahrscheinlich der wichtigste.
Als solche möchten Sie vielleicht
ausführendeleteObject
save
in einem performBlockAndWait
warte. Dies kann dazu beitragen, die Datenintegrität zu gewährleisten. Etwas in der Art:
Ich glaube nicht, dass das TableView aufgrund von Speicherproblemen oder unsymmetrischen begin * / endEditing-Aufrufen einfriert (eine Ausnahme würde ausgelöst oder ein Signal gesendet werden).
Ich denke, es könnte Sachen an einem anderen Thread als dem Hauptthread machen. In einem solchen Fall werden selbst Blöcke nicht helfen. (Setzen Sie einen Haltepunkt und prüfen Sie, welcher Thread stoppt ..., auch: Test auf einem echten Gerät)
Meine Idee, das zu beheben, ist etwas anderes zu versuchen, wie das Hinzufügen oder Entfernen von Daten zu einem temporären Array und das Aktualisieren des TableView innerhalb eines Methodenablaufs (rufen Sie diese Methode explizit auf, nachdem der Abrufergebnis-Controller beendet wurde) seine Delegierten Anrufe).
Haben Sie versucht, den Delegate von NSFetchedResultsControllerDelegate auf eine gebräuchlichere Art und Weise zu implementieren? Ich meine, begin table update, wenn helpedResultController fragt, Updates macht und dann die Aktualisierung beendet?
UPADATE:
Ist es möglich, dass wenn Sie ein Objekt als gelöscht markieren, es eine etwas kompliziertere Kette von Objektänderungen auslöst, was wiederum dazu führt, dass die Funktion didChangeObject mehrmals aufgerufen wird?
Haben Sie verfolgt, wie oft die Funktion "DidChangeObject" während der einzelnen Löschmarkierung aufgerufen wurde?
Tags und Links uitableview core-data swift nsfetchedresultscontroller