Fixes for pages and priority
This commit is contained in:
parent
44c7476542
commit
49f376d554
@ -21,13 +21,13 @@ public extension MVMCoreUITopAlertView {
|
|||||||
NotificationCenter.default.addObserver(self, selector: #selector(viewControllerChanged(notification:)), name: NSNotification.Name(rawValue: MVMCoreNotificationViewControllerChanged), object: nil)
|
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?
|
// TODO: Top alert view is current delegate. Should move to current view controller eventually?
|
||||||
return MVMCoreUIDelegateObject.create(withDelegateForAll: self)
|
return MVMCoreUIDelegateObject.create(withDelegateForAll: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Checks for new top alert json
|
/// 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,
|
guard let responseJSON = (notification.userInfo?[String(describing: MVMCoreLoadObject.self)] as? MVMCoreLoadObject)?.responseJSON,
|
||||||
let json = responseJSON.optionalDictionaryForKey("TopNotification"),
|
let json = responseJSON.optionalDictionaryForKey("TopNotification"),
|
||||||
let model = decodeTopNotification(with: json, delegateObject: getDelegateObject()) else { return }
|
let model = decodeTopNotification(with: json, delegateObject: getDelegateObject()) else { return }
|
||||||
@ -35,13 +35,43 @@ public extension MVMCoreUITopAlertView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// When a detail page changes, check top alerts.
|
/// 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 }
|
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
|
/// 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 {
|
do {
|
||||||
return try TopNotificationModel.decode(json: json, delegateObject: delegateObject)
|
return try TopNotificationModel.decode(json: json, delegateObject: delegateObject)
|
||||||
} catch {
|
} catch {
|
||||||
@ -55,7 +85,26 @@ public extension MVMCoreUITopAlertView {
|
|||||||
/// Shows the top alert with the model.
|
/// Shows the top alert with the model.
|
||||||
func showTopAlert(with model: TopNotificationModel) {
|
func showTopAlert(with model: TopNotificationModel) {
|
||||||
let object = model.createTopAlertObject()
|
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
|
/// Updates the current top alert molecule with the new object
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user