910e62b5创建于 1月15日历史提交
// Copyright 2024 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_QUEUE_H_
#define IOS_CHROME_APP_DEFERRED_INITIALIZATION_QUEUE_H_

#import <Foundation/Foundation.h>

#import "base/ios/block_types.h"
#import "base/time/time.h"

// Reference to a scheduled block (can be used to cancel it).
@class DeferredInitializationBlock;

// An object to manage a queue of blocks to run asynchronously.
@interface DeferredInitializationQueue : NSObject

// Returns a singleton instance.
+ (instancetype)sharedInstance;

// Initializes an instance with specified delays.
- (instancetype)initWithDelayBetweenBlocks:(base::TimeDelta)betweenBlocks
                     delayBeforeFirstBlock:(base::TimeDelta)beforeFirstBlock
    NS_DESIGNATED_INITIALIZER;

// Initializes an instance with default delays.
- (instancetype)init;

// Schedules `block` to be executed asynchronously.
- (DeferredInitializationBlock*)enqueueBlock:(ProceduralBlock)block;

// Executes `block` immediately.
- (void)runBlock:(DeferredInitializationBlock*)block;

// Cancels `block` if it has not been run yet.
- (void)cancelBlock:(DeferredInitializationBlock*)block;

// Cancels the blocks from `deferredBlocks` if they has not been run yet.
- (void)cancelBlocks:(NSArray<DeferredInitializationBlock*>*)deferredBlocks;

// Returns the size of the queue (i.e. the number of blocks scheduled pending).
@property(nonatomic, readonly) NSUInteger length;

@end

#endif  // IOS_CHROME_APP_DEFERRED_INITIALIZATION_QUEUE_H_