@@ -51,14 +51,9 @@ public final class FetchedResultsDelegateProvider<CellConfig: ReusableViewConfig
51
51
52
52
53
53
// 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 ] ( )
62
57
}
63
58
64
59
@@ -88,88 +83,75 @@ extension FetchedResultsDelegateProvider where CellConfig.View.ParentView == UIC
88
83
private func bridgedCollectionFetchedResultsDelegate( ) -> BridgedFetchedResultsDelegate {
89
84
let delegate = BridgedFetchedResultsDelegate (
90
85
willChangeContent: { [ unowned self] ( controller) in
86
+
91
87
self . sectionChanges. removeAll ( )
92
88
self . objectChanges. removeAll ( )
93
- self . updatedObjects. removeAll ( )
94
89
} ,
95
90
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
+ }
97
103
} ,
98
104
didChangeObject: { [ unowned self] ( controller, anyObject, indexPath: IndexPath ? , changeType, newIndexPath: IndexPath ? ) in
105
+
99
106
switch changeType {
100
107
case . insert:
101
108
if let insertIndexPath = newIndexPath {
102
- self . objectChanges. append ( ( changeType, [ insertIndexPath] ) )
109
+ self . objectChanges. append { [ unowned self] in
110
+ self . collectionView? . insertItems ( at: [ insertIndexPath] )
111
+ }
103
112
}
104
113
case . delete:
105
114
if let deleteIndexPath = indexPath {
106
- self . objectChanges. append ( ( changeType, [ deleteIndexPath] ) )
115
+ self . objectChanges. append { [ unowned self] in
116
+ self . collectionView? . deleteItems ( at: [ deleteIndexPath] )
117
+ }
107
118
}
108
119
case . update:
109
120
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
+ }
112
128
}
113
129
case . move:
114
130
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
+ }
116
135
}
117
136
}
118
137
} ,
119
138
didChangeContent: { [ unowned self] ( controller) in
139
+
120
140
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
124
148
self ? . reloadSupplementaryViewsIfNeeded ( )
125
149
} )
126
150
} )
127
151
128
152
return delegate
129
153
}
130
154
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
-
173
155
private func reloadSupplementaryViewsIfNeeded( ) {
174
156
if sectionChanges. count > 0 {
175
157
collectionView? . reloadData ( )
0 commit comments