chromium/ios/chrome/app/deferred_initialization_runner.h

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_APP_DEFERRED_INITIALIZATION_RUNNER_H_
#define IOS_CHROME_APP_DEFERRED_INITIALIZATION_RUNNER_H_

#import <Foundation/Foundation.h>

#include "base/ios/block_types.h"

// Constants for deferred initialization of preferences observer.
extern NSString* const kPrefObserverInit;

// A singleton object to run initialization code asynchronously. Blocks are
// scheduled to be run after a delay. The block is named when added to the
// singleton so that other code can force a deferred block to be run
// synchronously if necessary.
@interface DeferredInitializationRunner : NSObject

// Returns singleton instance.
+ (DeferredInitializationRunner*)sharedInstance;

// Stores `block` under `name` to a queue of blocks to run. All blocks are run
// sequentially with a small delay before the first block and between each
// successive block. If a block is already registered under `name`, it is
// replaced with `block` unless it has already been run.
- (void)enqueueBlockNamed:(NSString*)name block:(ProceduralBlock)block;

// Looks up a previously scheduled block of `name`. If block has not been
// run yet, run it synchronously now.
- (void)runBlockIfNecessary:(NSString*)name;

// Cancels a previously scheduled block of `name`. This is a no-op if the
// block has already been executed.
- (void)cancelBlockNamed:(NSString*)name;

// Number of blocks that have been registered but not executed yet.
// Exposed for testing.
@property(nonatomic, readonly) NSUInteger numberOfBlocksRemaining;

@end

@interface DeferredInitializationRunner (ExposedForTesting)

// Time interval between two blocks. Default value is 200ms.
@property(nonatomic, assign) NSTimeInterval delayBetweenBlocks;

// Time interval before running the first block. To override default value of
// 3s, set this property before the first call to `-enqueueBlockNamed:block:`.
@property(nonatomic, assign) NSTimeInterval delayBeforeFirstBlock;

@end

#endif  // IOS_CHROME_APP_DEFERRED_INITIALIZATION_RUNNER_H_