123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- //
- // RACScheduler.h
- // ReactiveObjC
- //
- // Created by Josh Abernathy on 4/16/12.
- // Copyright (c) 2012 GitHub, Inc. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- NS_ASSUME_NONNULL_BEGIN
- /// The priority for the scheduler.
- ///
- /// RACSchedulerPriorityHigh - High priority.
- /// RACSchedulerPriorityDefault - Default priority.
- /// RACSchedulerPriorityLow - Low priority.
- /// RACSchedulerPriorityBackground - Background priority.
- typedef enum : long {
- RACSchedulerPriorityHigh = DISPATCH_QUEUE_PRIORITY_HIGH,
- RACSchedulerPriorityDefault = DISPATCH_QUEUE_PRIORITY_DEFAULT,
- RACSchedulerPriorityLow = DISPATCH_QUEUE_PRIORITY_LOW,
- RACSchedulerPriorityBackground = DISPATCH_QUEUE_PRIORITY_BACKGROUND,
- } RACSchedulerPriority;
- /// Scheduled with -scheduleRecursiveBlock:, this type of block is passed a block
- /// with which it can call itself recursively.
- typedef void (^RACSchedulerRecursiveBlock)(void (^reschedule)(void));
- @class RACDisposable;
- /// Schedulers are used to control when and where work is performed.
- @interface RACScheduler : NSObject
- /// A singleton scheduler that immediately executes the blocks it is given.
- ///
- /// **Note:** Unlike most other schedulers, this does not set the current
- /// scheduler. There may still be a valid +currentScheduler if this is used
- /// within a block scheduled on a different scheduler.
- + (RACScheduler *)immediateScheduler;
- /// A singleton scheduler that executes blocks in the main thread.
- + (RACScheduler *)mainThreadScheduler;
- /// Creates and returns a new background scheduler with the given priority and
- /// name. The name is for debug and instrumentation purposes only.
- ///
- /// Scheduler creation is cheap. It's unnecessary to save the result of this
- /// method call unless you want to serialize some actions on the same background
- /// scheduler.
- + (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority name:(nullable NSString *)name;
- /// Invokes +schedulerWithPriority:name: with a default name.
- + (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority;
- /// Invokes +schedulerWithPriority: with RACSchedulerPriorityDefault.
- + (RACScheduler *)scheduler;
- /// The current scheduler. This will only be valid when used from within a
- /// -[RACScheduler schedule:] block or when on the main thread.
- + (nullable RACScheduler *)currentScheduler;
- /// Schedule the given block for execution on the scheduler.
- ///
- /// Scheduled blocks will be executed in the order in which they were scheduled.
- ///
- /// block - The block to schedule for execution. Cannot be nil.
- ///
- /// Returns a disposable which can be used to cancel the scheduled block before
- /// it begins executing, or nil if cancellation is not supported.
- - (nullable RACDisposable *)schedule:(void (^)(void))block;
- /// Schedule the given block for execution on the scheduler at or after
- /// a specific time.
- ///
- /// Note that blocks scheduled for a certain time will not preempt any other
- /// scheduled work that is executing at the time.
- ///
- /// When invoked on the +immediateScheduler, the calling thread **will block**
- /// until the specified time.
- ///
- /// date - The earliest time at which `block` should begin executing. The block
- /// may not execute immediately at this time, whether due to system load
- /// or another block on the scheduler currently being run. Cannot be nil.
- /// block - The block to schedule for execution. Cannot be nil.
- ///
- /// Returns a disposable which can be used to cancel the scheduled block before
- /// it begins executing, or nil if cancellation is not supported.
- - (nullable RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block;
- /// Schedule the given block for execution on the scheduler after the delay.
- ///
- /// Converts the delay into an NSDate, then invokes `-after:schedule:`.
- - (nullable RACDisposable *)afterDelay:(NSTimeInterval)delay schedule:(void (^)(void))block;
- /// Reschedule the given block at a particular interval, starting at a specific
- /// time, and with a given leeway for deferral.
- ///
- /// Note that blocks scheduled for a certain time will not preempt any other
- /// scheduled work that is executing at the time.
- ///
- /// Regardless of the value of `leeway`, the given block may not execute exactly
- /// at `when` or exactly on successive intervals, whether due to system load or
- /// because another block is currently being run on the scheduler.
- ///
- /// It is considered undefined behavior to invoke this method on the
- /// +immediateScheduler.
- ///
- /// date - The earliest time at which `block` should begin executing. The
- /// block may not execute immediately at this time, whether due to
- /// system load or another block on the scheduler currently being
- /// run. Cannot be nil.
- /// interval - The interval at which the block should be rescheduled, starting
- /// from `date`. This will use the system wall clock, to avoid
- /// skew when the computer goes to sleep.
- /// leeway - A hint to the system indicating the number of seconds that each
- /// scheduling can be deferred. Note that this is just a hint, and
- /// there may be some additional latency no matter what.
- /// block - The block to repeatedly schedule for execution. Cannot be nil.
- ///
- /// Returns a disposable which can be used to cancel the automatic scheduling and
- /// rescheduling, or nil if cancellation is not supported.
- - (nullable RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block;
- /// Schedule the given recursive block for execution on the scheduler. The
- /// scheduler will automatically flatten any recursive scheduling into iteration
- /// instead, so this can be used without issue for blocks that may keep invoking
- /// themselves forever.
- ///
- /// Scheduled blocks will be executed in the order in which they were scheduled.
- ///
- /// recursiveBlock - The block to schedule for execution. When invoked, the
- /// recursive block will be passed a `void (^)(void)` block
- /// which will reschedule the recursive block at the end of the
- /// receiver's queue. This passed-in block will automatically
- /// skip scheduling if the scheduling of the `recursiveBlock`
- /// was disposed in the meantime.
- ///
- /// Returns a disposable which can be used to cancel the scheduled block before
- /// it begins executing, or to stop it from rescheduling if it's already begun
- /// execution.
- - (nullable RACDisposable *)scheduleRecursiveBlock:(RACSchedulerRecursiveBlock)recursiveBlock;
- @end
- NS_ASSUME_NONNULL_END
|