2017-03-07 2 views
2

Ich verwende UICollectionView performBatchUpdates(_:completion:) Methode. Das Problem ist, dass manchmal meine komplexe Diff-Logik fehlschlägt und eine falsche Anzahl von einzufügenden Abschnitten zurückgibt. Dies führt zu einer Diskrepanz zwischen der Anzahl der Elemente, die ich einfüge, und der Anzahl, die von der Datenquelle gemeldet wird. Jedes Mal, wenn das passiert, bekommen wir die folgenden Fehler:Abfangen einer UICollectionView Chargenaktualisierung fehlgeschlagen in Swift?

Assertion failure in -[CollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:animator:]

Error when performing batch updates: Invalid update: invalid number of sections. The number of sections contained in the collection view after the update (25) must be equal to the number of sections contained in the collection view before the update (19), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted).

Mir ist klar, dass die richtige Lösung meiner diffing Logik zu beheben ist, so dass es keine Fehlanpassung zwischen der Anzahl der Elemente zurückgegeben und die Anzahl der Einfügungen Ich nenne .

Allerdings, was ich tun möchte, ist es so, dass auch wenn meine Logik in der Zukunft fehlschlägt, anstatt die App zu kollidieren, wird es einfach die Daten der Sammlungsansicht neu laden.

Wie kann ich dies in Swift tun?

Antwort

3

NSExceptions können standardmäßig nicht in Swift abgefangen werden, erstellen Sie also eine Brücke ähnlich this one oder this one.

Auch wenn Sie den Assertionsfehler the user cannot interact with the collection view abfangen, müssen Sie die Sammlungsansicht neu erstellen.

TryCatch.try({ 
    collectionView.performBatchUpdates({ 
    collectionView.insertItems(at: indexPaths) 
    collectionView.insertSections(sections) 
    }, completion: nil) 
}, catch: { exception in 
    print("Error updating collection view: \(exception)") 

    collectionView.removeFromSuperview() 

    // recreate the collection view (make sure to set datasource and delegates) 
    collectionView = ... 
    collectionView.dataSource = ... 
    collectionView.delegate = ... 
}, finally: nil) 
-1

hatte ich das gleiche Problem, ich einfach ein collectionView.reload() am Ende des Batch-Updates setzen und es funktionierte gut für mich.

Verwandte Themen