Digital PCT265 defect CXTDT-579050: Code simplification and fixes of combine pipeline for page updates.
This commit is contained in:
parent
4cbf15a3a7
commit
90f9a0bcf5
@ -285,6 +285,17 @@ open class Carousel: View {
|
|||||||
/// Registers the cells with the collection view
|
/// Registers the cells with the collection view
|
||||||
func registerCells(with carouselModel: CarouselModel, delegateObject: MVMCoreUIDelegateObject?) {
|
func registerCells(with carouselModel: CarouselModel, delegateObject: MVMCoreUIDelegateObject?) {
|
||||||
|
|
||||||
|
for molecule in carouselModel.molecules {
|
||||||
|
if let info = getMoleculeInfo(with: molecule, delegateObject: delegateObject) {
|
||||||
|
collectionView.register(info.class, forCellWithReuseIdentifier: info.identifier)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let moleculeInfo = carouselModel.molecules.map {
|
||||||
|
getMoleculeInfo(with: $0, delegateObject: delegateObject)
|
||||||
|
}
|
||||||
|
// For each molecule with info, register it.
|
||||||
|
moleculeInfo.compactMap({ $0 }).forEach { collectionView.register($0.class, forCellWithReuseIdentifier: $0.identifier) }
|
||||||
|
|
||||||
for molecule in carouselModel.molecules {
|
for molecule in carouselModel.molecules {
|
||||||
if let info = getMoleculeInfo(with: molecule, delegateObject: delegateObject) {
|
if let info = getMoleculeInfo(with: molecule, delegateObject: delegateObject) {
|
||||||
collectionView.register(info.class, forCellWithReuseIdentifier: info.identifier)
|
collectionView.register(info.class, forCellWithReuseIdentifier: info.identifier)
|
||||||
|
|||||||
@ -69,27 +69,16 @@ import Combine
|
|||||||
|
|
||||||
observingForResponses = NotificationCenter.default.publisher(for: NSNotification.Name(rawValue: NotificationResponseLoaded))
|
observingForResponses = NotificationCenter.default.publisher(for: NSNotification.Name(rawValue: NotificationResponseLoaded))
|
||||||
.receive(on: self.pageUpdateQueue) // Background serial queue.
|
.receive(on: self.pageUpdateQueue) // Background serial queue.
|
||||||
.map { [weak self] notification in
|
.compactMap { [weak self] notification in
|
||||||
self?.pullUpdates(from: notification) ?? (nil, nil, nil)
|
self?.pullUpdates(from: notification) ?? nil
|
||||||
}
|
|
||||||
.filter { (pageUpdates: [String : Any]?, pageModel: PageModelProtocol?, moduleUpdates: [String : Any]?) in
|
|
||||||
// Skip any non-updates.
|
|
||||||
(pageUpdates != nil && pageModel != nil) || (moduleUpdates != nil && moduleUpdates!.count > 0)
|
|
||||||
}
|
}
|
||||||
// Merge all page and module updates into one update event.
|
// Merge all page and module updates into one update event.
|
||||||
//.print("[Update pipe] merging")
|
|
||||||
.scan((nil, nil, nil)) { accumulator, next in
|
.scan((nil, nil, nil)) { accumulator, next in
|
||||||
// Always take the latest page and the latest modules with same key.
|
// Always take the latest page and the latest modules with same key.
|
||||||
return (next.0, next.1, next.2?.mergingRight(accumulator.2 ?? [:]))
|
return (next.0 ?? accumulator.0, next.1 ?? accumulator.1, next.2?.mergingRight(accumulator.2 ?? [:]))
|
||||||
}
|
}
|
||||||
//.print("[Update pipe] into buffer")
|
|
||||||
// Hold onto the latest merged state until UI is ready for an update. Keep only the latest from scan.
|
|
||||||
.buffer(size: 1, prefetch: .byRequest, whenFull: .dropOldest)
|
|
||||||
//.print("[Update pipe] out of buffer")
|
|
||||||
// Delay allowing the previous model update to settle before triggering a re-render.
|
// Delay allowing the previous model update to settle before triggering a re-render.
|
||||||
.flatMap(maxPublishers: .max(1)) { buffer in
|
.throttle(for: .seconds(0.05), scheduler: RunLoop.main, latest: true)
|
||||||
Just(buffer).delay(for: .seconds(0.1), scheduler: RunLoop.main)
|
|
||||||
}
|
|
||||||
.sink { [weak self] (pageUpdates: [String : Any]?, pageModel: PageModelProtocol?, moduleUpdates: [String : Any]?) in
|
.sink { [weak self] (pageUpdates: [String : Any]?, pageModel: PageModelProtocol?, moduleUpdates: [String : Any]?) in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
if let pageUpdates, pageModel != nil {
|
if let pageUpdates, pageModel != nil {
|
||||||
@ -108,7 +97,7 @@ import Combine
|
|||||||
self.observingForResponses = nil
|
self.observingForResponses = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func pullUpdates(from notification: Notification) -> (pageUpdates: [String : Any]?, pageModel: PageModelProtocol?, moduleUpdates: [String : Any]?) {
|
func pullUpdates(from notification: Notification) -> (pageUpdates: [String : Any]?, pageModel: PageModelProtocol?, moduleUpdates: [String : Any]?)? {
|
||||||
// Get the page data.
|
// Get the page data.
|
||||||
let pageUpdates = extractInterestedPageType(from: notification.userInfo?.optionalDictionaryForKey(KeyPageMap) ?? [:])
|
let pageUpdates = extractInterestedPageType(from: notification.userInfo?.optionalDictionaryForKey(KeyPageMap) ?? [:])
|
||||||
// Convert the page data into a new model.
|
// Convert the page data into a new model.
|
||||||
@ -125,7 +114,10 @@ import Combine
|
|||||||
}
|
}
|
||||||
// Get the module data.
|
// Get the module data.
|
||||||
let moduleUpdates = extractInterestedModules(from: notification.userInfo?.optionalDictionaryForKey(KeyModuleMap) ?? [:])
|
let moduleUpdates = extractInterestedModules(from: notification.userInfo?.optionalDictionaryForKey(KeyModuleMap) ?? [:])
|
||||||
debugLog("Receiving page \(pageModel?.pageType ?? "none") & \(moduleUpdates?.keys.description ?? "none") modules from \((notification.userInfo?["MVMCoreLoadObject"] as? MVMCoreLoadObject)?.requestParameters?.url?.absoluteString ?? "")")
|
debugLog("Receiving page \(pageModel?.pageType ?? "none") & \(moduleUpdates?.keys.description ?? "none") modules from \((notification.userInfo?["MVMCoreLoadObject"] as? MVMCoreLoadObject)?.requestParameters?.url?.absoluteString ?? "")")
|
||||||
|
|
||||||
|
guard (pageUpdates != nil && pageModel != nil) || (moduleUpdates != nil && moduleUpdates!.count > 0) else { return nil }
|
||||||
|
|
||||||
// Bundle the transformations.
|
// Bundle the transformations.
|
||||||
return (pageUpdates, pageModel, moduleUpdates)
|
return (pageUpdates, pageModel, moduleUpdates)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user