Slide 1

Slide 1 text

Collection Update

Slide 2

Slide 2 text

About —[email protected] —https://github.com/onmyway133 —https://github.com/hyperoslo

Slide 3

Slide 3 text

Content —TableView / CollectionView —Drag and Drop —Let's play some games ! —Diff

Slide 4

Slide 4 text

NSCollectionView !

Slide 5

Slide 5 text

Newsloop

Slide 6

Slide 6 text

Drag and Drop Demo !

Slide 7

Slide 7 text

index vs offset Array(0..<10).enumerated().forEach { (offset, element) in } - https://en.wikipedia.org/wiki/Zero-based_numbering - offset from the starting position

Slide 8

Slide 8 text

NSInternalInconsistencyException Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of items in section 0. The number of items contained in an existing section after the update (213) must be equal to the number of items contained in that section before the update (154), plus or minus the number of items inserted or deleted from that section (40 inserted, 0 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out).'

Slide 9

Slide 9 text

Game of IndexPath —https://github.com/onmyway133/ CollectionUpdateExample —10 quizzes items = ["a", "b", "c", "d", "e", "f"]

Slide 10

Slide 10 text

1) insert 3 items at the end items.append(contentsOf: ["g", "h", "i"]) // a, b, c, d, e, f, g, h, i let indexPaths = Array(6...8).map { IndexPath(item: $0, section: 0) } collectionView.insertItems(at: indexPaths)

Slide 11

Slide 11 text

2) delete 3 items at the end items.removeLast() items.removeLast() items.removeLast() // a, b, c let indexPaths = Array(3...5).map { IndexPath(item: $0, section: 0) } collectionView.deleteItems(at: indexPaths)

Slide 12

Slide 12 text

3) update item at index 2 items[2] = " ! " // a, b, ! , d, e, f let indexPath = IndexPath(item: 2, section: 0) collectionView.reloadItems(at: [indexPath])

Slide 13

Slide 13 text

4) move item "c" to the end items.remove(at: 2) items.append("c") // a, b, d, e, f, c collectionView.moveItem( at: IndexPath(item: 2, section: 0), to: IndexPath(item: 5, section :0) )

Slide 14

Slide 14 text

5) delete 3 items at the beginning, then insert 3 items at the end items.removeFirst() items.removeFirst() items.removeFirst() items.append(contentsOf: ["g", "h", "i"]) // d, e, f, g, h, i collectionView.performBatchUpdates({ let deleteIndexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) } collectionView.deleteItems(at: deleteIndexPaths) let insertIndexPaths = Array(3...5).map { IndexPath(item: $0, section: 0) } collectionView.insertItems(at: insertIndexPaths) }, completion: nil)

Slide 15

Slide 15 text

6) insert 3 items at the end, then delete 3 items beginning items.append(contentsOf: ["g", "h", "i"]) items.removeFirst() items.removeFirst() items.removeFirst() // d, e, f, g, h, i collectionView.performBatchUpdates({ let insertIndexPaths = Array(6...8).map { IndexPath(item: $0, section: 0) } collectionView.insertItems(at: insertIndexPaths) let deleteIndexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) } collectionView.deleteItems(at: deleteIndexPaths) }, completion: nil)

Slide 16

Slide 16 text

! Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to insert item 6 into section 0, but there are only 6 items in section 0 after the update'

Slide 17

Slide 17 text

performBatchUpdates Deletes are processed before inserts in batch operations

Slide 18

Slide 18 text

6) insert 3 items at the end, then delete 3 items beginning ! items.append(contentsOf: ["g", "h", "i"]) items.removeFirst() items.removeFirst() items.removeFirst() // d, e, f, g, h, i collectionView.performBatchUpdates({ let deleteIndexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) } collectionView.deleteItems(at: deleteIndexPaths) let insertIndexPaths = Array(3...5).map { IndexPath(item: $0, section: 0) } collectionView.insertItems(at: insertIndexPaths) }, completion: nil)

Slide 19

Slide 19 text

Operations insertItems(at indexPaths: [IndexPath]) deleteItems(at indexPaths: [IndexPath]) reloadItems(at indexPaths: [IndexPath]) moveItem(at indexPath: IndexPath, to newIndexPath: IndexPath) performBatchUpdates(_ updates, completion) insertSections(_ sections: IndexSet) deleteSections(_ sections: IndexSet) reloadSections(_ sections: IndexSet) moveSection(_ section: Int, toSection newSection: Int)

Slide 20

Slide 20 text

Ordering of Operations and Index Paths —https://developer.apple.com/library/content/ documentation/UserExperience/Conceptual/ TableView_iPhone/ManageInsertDeleteRow/ ManageInsertDeleteRow.html

Slide 21

Slide 21 text

Wagner–Fischer algorithm —https://en.wikipedia.org/wiki/ Wagner%E2%80%93Fischer_algorithm —https://en.wikipedia.org/wiki/ Dynamic_programming Computes the edit distance between two strings of characters.

Slide 22

Slide 22 text

"kit" -> "kat"

Slide 23

Slide 23 text

Deletions "k" -> "" ! 1 deletion "ki" -> "" ! 2 deletions "kit" -> "" ! 3 deletions

Slide 24

Slide 24 text

Insertions "" -> "k" ! 1 insertion "" -> "ka" ! 2 insertions "" -> "kat" ! 3 insertions

Slide 25

Slide 25 text

If equal, take value from the top left

Slide 26

Slide 26 text

horizonally: insertion vertically: deletion diagonally: substitution If not equal, check minimum value from left, top, top left. Then increase by one

Slide 27

Slide 27 text

"k" -> "kat" ! 2 insertions

Slide 28

Slide 28 text

It equals again, take value from top left. Bottom right value gives edit distance (number of steps) "kit" -> "kat" ! Substitute "i" with "a"

Slide 29

Slide 29 text

insertions: insertItems deletions: deleteItems substitutions: reloadItems move: deletion + insertion moveItem

Slide 30

Slide 30 text

Edit steps —delete, insert, move, substitute —https://github.com/onmyway133/DeepDiff

Slide 31

Slide 31 text

Complexity —O(mn) —10k items ! Performance —Collection size —Equatable —Hashable

Slide 32

Slide 32 text

Alternatives —Heckel http://documents.scribd.com/docs/ 10ro9oowpo1h81pgh1as.pdf —Wu https://publications.mpi-cbg.de/ Wu19906334.pdf —Myers http://www.xmailserver.org/diff2.pdf

Slide 33

Slide 33 text

Q & A Thanks for listening. Hope you have a great time