Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 83d1ba4

Browse files
[Refactor] simplify FetchedResultsDelegateProvider
Simplify object and section changes. Use array of closures and then execute them. This also allows getting rid of a lot of extra state. Close jessesquires#71
1 parent 2c3f523 commit 83d1ba4

File tree

1 file changed

+42
-60
lines changed

1 file changed

+42
-60
lines changed

‎Source/FetchedResultsDelegate.swift‎

Lines changed: 42 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,9 @@ public final class FetchedResultsDelegateProvider<CellConfig: ReusableViewConfig
5151

5252

5353
// MARK: Private, collection view properties
54-
55-
private typealias SectionChangeTuple = (changeType: NSFetchedResultsChangeType, sectionIndex: Int)
56-
private lazy var sectionChanges = [SectionChangeTuple]()
57-
58-
private typealias ObjectChangeTuple = (changeType: NSFetchedResultsChangeType, indexPaths: [IndexPath])
59-
private lazy var objectChanges = [ObjectChangeTuple]()
60-
61-
private lazy var updatedObjects = [IndexPath: Item]()
54+
55+
private lazy var sectionChanges = [() -> Void]()
56+
private lazy var objectChanges = [() -> Void]()
6257
}
6358

6459

@@ -88,88 +83,75 @@ extension FetchedResultsDelegateProvider where CellConfig.View.ParentView == UIC
8883
private func bridgedCollectionFetchedResultsDelegate() -> BridgedFetchedResultsDelegate {
8984
let delegate = BridgedFetchedResultsDelegate(
9085
willChangeContent: { [unowned self] (controller) in
86+
9187
self.sectionChanges.removeAll()
9288
self.objectChanges.removeAll()
93-
self.updatedObjects.removeAll()
9489
},
9590
didChangeSection: { [unowned self] (controller, sectionInfo, sectionIndex, changeType) in
96-
self.sectionChanges.append((changeType, sectionIndex))
91+
92+
let section = IndexSet(integer: sectionIndex)
93+
self.sectionChanges.append { [unowned self] in
94+
switch(changeType) {
95+
case .insert:
96+
self.collectionView?.insertSections(section)
97+
case .delete:
98+
self.collectionView?.deleteSections(section)
99+
default:
100+
break
101+
}
102+
}
97103
},
98104
didChangeObject: { [unowned self] (controller, anyObject, indexPath: IndexPath?, changeType, newIndexPath: IndexPath?) in
105+
99106
switch changeType {
100107
case .insert:
101108
if let insertIndexPath = newIndexPath {
102-
self.objectChanges.append((changeType, [insertIndexPath]))
109+
self.objectChanges.append { [unowned self] in
110+
self.collectionView?.insertItems(at: [insertIndexPath])
111+
}
103112
}
104113
case .delete:
105114
if let deleteIndexPath = indexPath {
106-
self.objectChanges.append((changeType, [deleteIndexPath]))
115+
self.objectChanges.append { [unowned self] in
116+
self.collectionView?.deleteItems(at: [deleteIndexPath])
117+
}
107118
}
108119
case .update:
109120
if let indexPath = indexPath {
110-
self.objectChanges.append((changeType, [indexPath]))
111-
self.updatedObjects[indexPath] = anyObject as? Item
121+
self.objectChanges.append { [unowned self] in
122+
if let item = anyObject as? Item,
123+
let collectionView = self.collectionView,
124+
let cell = collectionView.cellForItem(at: indexPath) as? CellConfig.View {
125+
self.cellConfig.configure(view: cell, item: item, type: .cell, parentView: collectionView, indexPath: indexPath)
126+
}
127+
}
112128
}
113129
case .move:
114130
if let old = indexPath, let new = newIndexPath {
115-
self.objectChanges.append((changeType, [old, new]))
131+
self.objectChanges.append { [unowned self] in
132+
self.collectionView?.deleteItems(at: [old])
133+
self.collectionView?.insertItems(at: [new])
134+
}
116135
}
117136
}
118137
},
119138
didChangeContent: { [unowned self] (controller) in
139+
120140
self.collectionView?.performBatchUpdates({ [weak self] in
121-
self?.applyObjectChanges()
122-
self?.applySectionChanges()
123-
}, completion:{ [weak self] finished in
141+
// apply object changes
142+
self?.objectChanges.forEach { 0ドル() }
143+
144+
// apply section changes
145+
self?.sectionChanges.forEach { 0ドル() }
146+
147+
}, completion: { [weak self] finished in
124148
self?.reloadSupplementaryViewsIfNeeded()
125149
})
126150
})
127151

128152
return delegate
129153
}
130154

131-
private func applyObjectChanges() {
132-
for (changeType, indexPaths) in objectChanges {
133-
134-
switch(changeType) {
135-
case .insert:
136-
collectionView?.insertItems(at: indexPaths)
137-
case .delete:
138-
collectionView?.deleteItems(at: indexPaths)
139-
case .update:
140-
if let indexPath = indexPaths.first,
141-
let item = updatedObjects[indexPath],
142-
let collectionView = collectionView,
143-
let cell = collectionView.cellForItem(at: indexPath) as? CellConfig.View {
144-
cellConfig.configure(view: cell, item: item, type: .cell, parentView: collectionView, indexPath: indexPath)
145-
}
146-
case .move:
147-
if let deleteIndexPath = indexPaths.first {
148-
self.collectionView?.deleteItems(at: [deleteIndexPath])
149-
}
150-
151-
if let insertIndexPath = indexPaths.last {
152-
self.collectionView?.insertItems(at: [insertIndexPath])
153-
}
154-
}
155-
}
156-
}
157-
158-
private func applySectionChanges() {
159-
for (changeType, sectionIndex) in sectionChanges {
160-
let section = IndexSet(integer: sectionIndex)
161-
162-
switch(changeType) {
163-
case .insert:
164-
collectionView?.insertSections(section)
165-
case .delete:
166-
collectionView?.deleteSections(section)
167-
default:
168-
break
169-
}
170-
}
171-
}
172-
173155
private func reloadSupplementaryViewsIfNeeded() {
174156
if sectionChanges.count > 0 {
175157
collectionView?.reloadData()

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /