@@ -179,9 +179,9 @@ private extension ItemDataCalculator {
179179 }
180180 }
181181 }
182-
183- // Short circuit if there are too many items
184-
182+
183+ // calculate data change
184+
185185 let dataSetTooLarge = itemProvider. items. count > itemProvider. dataCountAnimationThreshold ||
186186 updatedItems. count > itemProvider. dataCountAnimationThreshold
187187
@@ -194,23 +194,9 @@ private extension ItemDataCalculator {
194194 } else {
195195 ( delta, deletedItems) = _calculateDelta ( updatedItems, itemProvider: itemProvider)
196196 }
197-
197+
198198 let deltaChangeTooLarge = delta. changeCount > itemProvider. deltaCountAnimationThreshold
199-
200- guard dataSetTooLarge == false && deltaChangeTooLarge == false else {
201- _updateSections ( updatedItems,
202- itemProvider: itemProvider,
203- section: section,
204- viewProvider: viewProvider,
205- viewDelegate: viewDelegate,
206- deletionDelegate: deletionDelegate,
207- updateData: updateData,
208- completion: completion)
209- return
210- }
211-
212- // Otherwise animate
213-
199+
214200 let calculationCompletion : ( ) -> Void = { [ weak self, weak weakDeletionDelegate = deletionDelegate] in
215201 completion ? ( )
216202 if deletedItems. isEmpty == false {
@@ -224,12 +210,7 @@ private extension ItemDataCalculator {
224210 calculationCompletion ( )
225211 return
226212 }
227-
228- let itemAnimationStlye : AnimationStyle = {
229- guard let animationDelegate = animationDelegate else { return . preciseAnimations }
230- return animationDelegate. preferredItemAnimationStyle ( for: delta)
231- } ( )
232-
213+
233214 DispatchQueue . main. async { [ weak weakViewProvider = viewProvider] in
234215 guard let targetView = weakViewProvider? . view else {
235216 updateData ( )
@@ -240,14 +221,40 @@ private extension ItemDataCalculator {
240221 if targetView !== view {
241222 targetView. reloadData ( )
242223 }
243-
224+
225+ let itemAnimationStlye : AnimationStyle = {
226+ if view. frame. isEmpty { return . reloadData }
227+ guard let animationDelegate = animationDelegate else { return . preciseAnimations }
228+ return animationDelegate. preferredItemAnimationStyle ( for: delta)
229+ } ( )
230+
244231 switch itemAnimationStlye {
245232 case . reloadData:
246233 updateData ( )
247234 targetView. reloadData ( )
248235 calculationCompletion ( )
249-
250- case . reloadSections:
236+
237+ case . reloadSections,
238+ . preciseAnimations:
239+ // Short circuit if there are too many items
240+ guard dataSetTooLarge == false && deltaChangeTooLarge == false else {
241+ self . _updateSections ( updatedItems,
242+ itemProvider: itemProvider,
243+ section: section,
244+ viewProvider: viewProvider,
245+ viewDelegate: viewDelegate,
246+ deletionDelegate: deletionDelegate,
247+ updateData: updateData,
248+ completion: completion)
249+ return
250+ }
251+ }
252+
253+ // Otherwise animate
254+
255+ switch itemAnimationStlye {
256+ case . reloadData,
257+ . reloadSections:
251258 let sectionUpdate = SectionUpdate ( section: section,
252259 delta: delta,
253260 delegate: viewDelegate,
@@ -294,41 +301,26 @@ private extension ItemDataCalculator {
294301 }
295302 }
296303 }
297-
298- let calculationCompletion : ( ) -> Void = { [ weak self] in
299- completion ? ( )
300- self ? . _performNextCalculation ( )
301- }
302304
303- // Short circuit if there are too many items
305+ // calculate data change
304306
305307 let deltaChangeTooLarge = delta. changeCount > itemProvider. deltaCountAnimationThreshold
306-
307- guard deltaChangeTooLarge == false else {
308- _updateSections ( section: section,
309- viewProvider: viewProvider,
310- viewDelegate: viewDelegate,
311- updateData: updateData,
312- calculationCompletion: calculationCompletion)
313- return
308+
309+ let calculationCompletion : ( ) -> Void = { [ weak self] in
310+ completion ? ( )
311+ self ? . _performNextCalculation ( )
314312 }
315313
316- // Otherwise animate
317-
318314 guard delta. hasChanges else {
319315 itemProvider. calculatingItems = nil
320316 calculationCompletion ( )
321317 return
322318 }
323-
324- let itemAnimationStlye : AnimationStyle = {
325- guard let animationDelegate = animationDelegate else { return . preciseAnimations }
326- return animationDelegate. preferredItemAnimationStyle ( for: delta)
327- } ( )
328-
319+
329320 let startingItemCount = itemProvider. items. count
330321
331322 DispatchQueue . main. async { [ weak weakItemProvider = itemProvider, weak weakViewProvider = viewProvider] in
323+
332324 guard let strongItemProvider = weakItemProvider,
333325 let strongViewProvider = weakViewProvider,
334326 let targetView = weakViewProvider? . view else {
@@ -340,14 +332,36 @@ private extension ItemDataCalculator {
340332 if targetView !== view {
341333 targetView. reloadData ( )
342334 }
343-
335+
336+ let itemAnimationStlye : AnimationStyle = {
337+ if view. frame. isEmpty { return . reloadData }
338+ guard let animationDelegate = animationDelegate else { return . preciseAnimations }
339+ return animationDelegate. preferredItemAnimationStyle ( for: delta)
340+ } ( )
341+
344342 switch itemAnimationStlye {
345343 case . reloadData:
346344 updateData ( )
347345 targetView. reloadData ( )
348346 calculationCompletion ( )
349-
350- case . reloadSections:
347+ case . reloadSections,
348+ . preciseAnimations:
349+ // Short circuit if there are too many items
350+ guard deltaChangeTooLarge == false else {
351+ self . _updateSections ( section: section,
352+ viewProvider: viewProvider,
353+ viewDelegate: viewDelegate,
354+ updateData: updateData,
355+ calculationCompletion: calculationCompletion)
356+ return
357+ }
358+ }
359+
360+ // Otherwise animate
361+
362+ switch itemAnimationStlye {
363+ case . reloadData,
364+ . reloadSections:
351365 let sectionUpdate = SectionUpdate ( section: section,
352366 delta: delta,
353367 delegate: viewDelegate,
0 commit comments