147 lines
6.5 KiB
Objective-C
147 lines
6.5 KiB
Objective-C
//
|
|
// 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
|