Fixes for pages and priority

This commit is contained in:
Pfeil, Scott Robert 2020-10-21 11:44:44 -04:00
parent 44c7476542
commit 49f376d554

View File

@ -21,13 +21,13 @@ public extension MVMCoreUITopAlertView {
NotificationCenter.default.addObserver(self, selector: #selector(viewControllerChanged(notification:)), name: NSNotification.Name(rawValue: MVMCoreNotificationViewControllerChanged), object: nil)
}
@objc func getDelegateObject() -> MVMCoreUIDelegateObject {
private func getDelegateObject() -> MVMCoreUIDelegateObject {
// TODO: Top alert view is current delegate. Should move to current view controller eventually?
return MVMCoreUIDelegateObject.create(withDelegateForAll: self)
}
/// Checks for new top alert json
@objc func responseJSONUpdated(notification: Notification) {
@objc private func responseJSONUpdated(notification: Notification) {
guard let responseJSON = (notification.userInfo?[String(describing: MVMCoreLoadObject.self)] as? MVMCoreLoadObject)?.responseJSON,
let json = responseJSON.optionalDictionaryForKey("TopNotification"),
let model = decodeTopNotification(with: json, delegateObject: getDelegateObject()) else { return }
@ -35,13 +35,43 @@ public extension MVMCoreUITopAlertView {
}
/// When a detail page changes, check top alerts.
@objc func viewControllerChanged(notification: Notification) {
@objc private func viewControllerChanged(notification: Notification) {
guard let controller = MVMCoreUISplitViewController.main()?.getCurrentDetailViewController() as? MVMCoreViewControllerProtocol else { return }
MVMCoreAlertHandler.shared()?.checkPagesDependency(for: controller.pageType)
MVMCoreAlertHandler.shared()?.handleAllPagesDependency(for: controller.pageType)
reevalutePriority()
}
/// Re-evaluates the queue priority
private func reevalutePriority() {
guard let operations = MVMCoreAlertHandler.shared()?.topAlertQueue.operations else { return }
var highestReadyOperation: Operation?
var executingOperation: Operation?
for operation in operations {
guard !operation.isCancelled,
!operation.isFinished else {
continue
}
if operation.isReady,
highestReadyOperation == nil || operation.queuePriority.rawValue > highestReadyOperation!.queuePriority.rawValue {
highestReadyOperation = operation
}
if operation.isExecuting {
executingOperation = operation
}
}
// If the highest priority operation is not executing, and the executing operation is persistent, cancel it.
if let newOperation = highestReadyOperation,
let currentOperation = executingOperation as? MVMCoreTopAlertOperation,
currentOperation != newOperation,
currentOperation.topAlertObject.persistent {
currentOperation.reAddAfterCancel = true
currentOperation.cancel()
}
}
/// Decodes the json into a TopNotificationModel
func decodeTopNotification(with json: [AnyHashable: Any], delegateObject: MVMCoreUIDelegateObject?) -> TopNotificationModel? {
private func decodeTopNotification(with json: [AnyHashable: Any], delegateObject: MVMCoreUIDelegateObject?) -> TopNotificationModel? {
do {
return try TopNotificationModel.decode(json: json, delegateObject: delegateObject)
} catch {
@ -55,7 +85,26 @@ public extension MVMCoreUITopAlertView {
/// Shows the top alert with the model.
func showTopAlert(with model: TopNotificationModel) {
let object = model.createTopAlertObject()
MVMCoreAlertHandler.shared()?.showTopAlert(with: object)
guard !checkAndUpdateExisting(with: object),
let operation = MVMCoreTopAlertOperation(topAlertObject: object) else { return }
MVMCoreAlertHandler.shared()?.addPagesDependency(to: operation)
MVMCoreAlertHandler.shared()?.handlePageDependency(for: operation, with: (MVMCoreUISplitViewController.main()?.getCurrentDetailViewController() as? MVMCoreViewControllerProtocol)?.pageType)
MVMCoreAlertHandler.shared()?.add(operation)
}
/// Checks for existing top alert object of same type and updates it. Only happens for molecular top alerts. Returns true if we updated.
private func checkAndUpdateExisting(with topAlertObject: MVMCoreTopAlertObject) -> Bool {
guard let queue = MVMCoreAlertHandler.shared()?.topAlertQueue.operations else { return false }
for case let operation as MVMCoreTopAlertOperation in queue {
guard topAlertObject.json != nil,
operation.topAlertObject.type == topAlertObject.type else { continue }
operation.update(with: topAlertObject)
MVMCoreAlertHandler.shared()?.updatePages(for: operation, with: topAlertObject)
MVMCoreAlertHandler.shared()?.handlePageDependency(for: operation, with: (MVMCoreUISplitViewController.main()?.getCurrentDetailViewController() as? MVMCoreViewControllerProtocol)?.pageType)
reevalutePriority()
return true
}
return false
}
/// Updates the current top alert molecule with the new object