Skip to content

Commit c84ffae

Browse files
author
Stephane Magne
authored
Merge pull request #6 from scribd/stephane/respect_animation_flags
Update calculator to reload data if the view frame is zero/empty. Make sure to respect reloading data even when data threshold is too high.
2 parents 4db617b + d3c830d commit c84ffae

File tree

4 files changed

+104
-73
lines changed

4 files changed

+104
-73
lines changed

LiveCollectionsFramework/LiveCollections/Classes/Internal/ItemDataCalculator.swift

Lines changed: 67 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

LiveCollectionsFramework/LiveCollections/Classes/Internal/SectionDataCalculator.swift

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -202,13 +202,15 @@ private extension SectionDataCalculator {
202202
typealias SectionUpdateCompletion = () -> Void
203203

204204
let performSectionUpdates: (SectionUpdateCompletion?) -> Void = { sectionUpdateCompletion in
205-
let sectionAnimationStlye: AnimationStyle = {
206-
guard let animationDelegate = animationDelegate else { return .preciseAnimations }
207-
return animationDelegate.preferredSectionAnimationStyle(for: sectionDelta)
208-
}()
209-
205+
210206
DispatchQueue.main.async {
211207

208+
let sectionAnimationStlye: AnimationStyle = {
209+
if view.frame.isEmpty { return .reloadData }
210+
guard let animationDelegate = animationDelegate else { return .preciseAnimations }
211+
return animationDelegate.preferredSectionAnimationStyle(for: sectionDelta)
212+
}()
213+
212214
let sectionUpdateData = {
213215
sectionProvider.sections = sections
214216
sectionProvider.items = items
@@ -291,19 +293,21 @@ private extension SectionDataCalculator {
291293
sectionProvider.items = items
292294
sectionProvider.calculatingSections = nil
293295
}
294-
295-
let itemAnimationStlye: AnimationStyle = {
296-
guard let animationDelegate = animationDelegate else { return .preciseAnimations }
297-
return animationDelegate.preferredItemAnimationStyle(for: itemDelta)
298-
}()
299-
296+
300297
DispatchQueue.main.async { [weak weakView = view] in
298+
301299
guard let strongView = weakView else {
302300
updateData()
303301
calculationCompletion()
304302
return
305303
}
306-
304+
305+
let itemAnimationStlye: AnimationStyle = {
306+
if view.frame.isEmpty { return .reloadData }
307+
guard let animationDelegate = animationDelegate else { return .preciseAnimations }
308+
return animationDelegate.preferredItemAnimationStyle(for: itemDelta)
309+
}()
310+
307311
switch itemAnimationStlye {
308312
case .reloadData:
309313
updateData()
@@ -362,19 +366,21 @@ private extension SectionDataCalculator {
362366
let insertedIndices = [Int](startingCount..<(startingCount + appendedItems.count))
363367
let sectionDelta = IndexDelta(insertions: insertedIndices)
364368

365-
let sectionAnimationStlye: AnimationStyle = {
366-
guard let animationDelegate = animationDelegate else { return .preciseAnimations }
367-
return animationDelegate.preferredSectionAnimationStyle(for: sectionDelta)
368-
}()
369-
370369
DispatchQueue.main.async { [weak weakSectionProvider = sectionProvider, weak weakView = view] in
370+
371371
guard let strongSectionProvider = weakSectionProvider,
372372
let strongView = weakView else {
373373
updateData()
374374
calculationCompletion()
375375
return
376376
}
377-
377+
378+
let sectionAnimationStlye: AnimationStyle = {
379+
if view.frame.isEmpty { return .reloadData }
380+
guard let animationDelegate = animationDelegate else { return .preciseAnimations }
381+
return animationDelegate.preferredSectionAnimationStyle(for: sectionDelta)
382+
}()
383+
378384
switch sectionAnimationStlye {
379385
case .reloadData:
380386
updateData()

LiveCollectionsFramework/LiveCollections/Classes/Public/Protocols/Visual Update/DeltaVisualUpdateProtocols.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ public protocol DeltaUpdatableViewDelegate: CollectionDataManualReloadDelegate,
1717
public protocol SectionDeltaUpdatableViewDelegate: CollectionDataManualReloadDelegate, CollectionSectionDataAnimationDelegate { }
1818

1919
public protocol DeltaUpdatableView: AnyObject {
20-
20+
21+
/// Basic view frame getter
22+
var frame: CGRect { get }
23+
2124
/// Basic reloadData function
2225
func reloadData()
2326

@@ -40,6 +43,10 @@ public protocol DeltaUpdatableView: AnyObject {
4043

4144
public protocol SectionDeltaUpdatableView: AnyObject {
4245

46+
/// Standard view frame getter
47+
var frame: CGRect { get }
48+
49+
/// Basic reloadData function
4350
func reloadData()
4451

4552
/**

LiveCollectionsFramework/LiveCollections/Classes/Public/Synchronizer/CollectionDataSynchronizer.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,11 @@ public final class CollectionDataSynchronizer: DeltaUpdatableView {
112112
}
113113

114114
// MARK: DeltaUpdatableView
115-
115+
116+
public var frame: CGRect {
117+
return view?.frame ?? .zero
118+
}
119+
116120
public func reloadData() {
117121
view?.reloadData()
118122
}

0 commit comments

Comments
 (0)