Conditions
Conditions (can) prevent Operations from starting
Conditions are types, usually structs, which conform to OperationCondiiton
. They are added to operations just like dependencies and observers.
A silly example would be:
operation.addCondition(BlockCondition {
// operation will only be executed if this is true
return trueOrFalse
})
Evaluating conditions
Before an operation is ready to execute, it will asynchronously evaluate all of its conditions. Each condition will return a result of either .Satisfied
or .Failed(ErrorType)
. If a condition fails, the operation will finish with an error.
But wait, there is more...
Providing a dependency
A condition can also optionally provide an NSOperation
as a dependency. This operation will automatically be set as a dependency of the operation the condition was attached to. Therefore, given that all dependencies are executed before the operation evaluates its conditions, it means that whatever crucial detail must be set to satisfy the condition can be performed in another operation. This is pretty neat, and underpins much of the framework.
But wait, there is more...
Mutual exclusion
A condition can assert whether its operation should be evaluated with mutual exclusion of other instances. This can be very handy for stopping operations from executing.
For example, if our application presents a modal alert, by executing this in the context of an operation with a mutually exclusive condition, we will prevent any other modal alert from being presented. Given the nature of event based applications this would otherwise be quite tricky. With Operations this can be done like this:
let alert = AlertOperation(presentAlertFrom: viewController)
alert.title = NSLocaledString("Hello World", comment: "Hello World")
queue.addOperation(alert)
AlertOperation
adds a mutually exclusive condition to itself during its initializer.
Provided conditions
The framework comes with a number of operation conditions. Some are simple building blocks, others are more feature rich.
Condition | Usage |
---|---|
AuthorizedFor | Ensures that the user has allowed permission for the app to access a device or account capability. For example, location services. |
BlockCondition | Evaluates based on a () -> Bool block. |
MutuallyExclusive | Is always satisfied but forces mutual exclusion around a generic type. |
NegatedCondition | Evaluates the negation of a composed condition. |
NoFailedDependenciesCondition | All dependencies must finish without and error or being cancelled. |
SilentCondition | Suppresses any dependency of a composed condition. |
ReachabilityCondition | Ensures that the network host is reachable. |
RemoteNotificationCondition | On iOS, ensures that the user has been prompted to allow remote notifications. |
UserConfirmationCondition | On iOS, will prompt the user to confirm an action via a UIAlertOperation . This is great for asking the user to confirm destructive actions. |
UserNotificationCondition | On iOS, ensures that the user has been prompted to allow user notifications. |
Updated less than a minute ago