mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			129 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Matlab
		
	
		
		
			
		
	
	
			129 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Matlab
		
	
| 
											5 years ago
										 | // | ||
|  | //  Copyright (c) 2018 Open Whisper Systems. All rights reserved. | ||
|  | // | ||
|  | 
 | ||
|  | #import "AppReadiness.h" | ||
|  | #import "AppContext.h" | ||
| 
											5 years ago
										 | #import <SignalCoreKit/SignalCoreKit.h> | ||
|  | #import <SignalCoreKit/Threading.h> | ||
| 
											5 years ago
										 | 
 | ||
|  | NS_ASSUME_NONNULL_BEGIN | ||
|  | 
 | ||
|  | @interface AppReadiness () | ||
|  | 
 | ||
|  | @property (atomic) BOOL isAppReady; | ||
|  | 
 | ||
|  | @property (nonatomic) NSMutableArray<AppReadyBlock> *appWillBecomeReadyBlocks; | ||
|  | @property (nonatomic) NSMutableArray<AppReadyBlock> *appDidBecomeReadyBlocks; | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | #pragma mark - | ||
|  | 
 | ||
|  | @implementation AppReadiness | ||
|  | 
 | ||
|  | + (instancetype)sharedManager | ||
|  | { | ||
|  |     static AppReadiness *sharedMyManager = nil; | ||
|  |     static dispatch_once_t onceToken; | ||
|  |     dispatch_once(&onceToken, ^{ | ||
|  |         sharedMyManager = [[self alloc] initDefault]; | ||
|  |     }); | ||
|  |     return sharedMyManager; | ||
|  | } | ||
|  | 
 | ||
|  | - (instancetype)initDefault | ||
|  | { | ||
|  |     self = [super init]; | ||
|  | 
 | ||
|  |     if (!self) { | ||
|  |         return self; | ||
|  |     } | ||
|  | 
 | ||
|  |     self.appWillBecomeReadyBlocks = [NSMutableArray new]; | ||
|  |     self.appDidBecomeReadyBlocks = [NSMutableArray new]; | ||
|  | 
 | ||
|  |     return self; | ||
|  | } | ||
|  | 
 | ||
|  | + (BOOL)isAppReady | ||
|  | { | ||
|  |     return [self.sharedManager isAppReady]; | ||
|  | } | ||
|  | 
 | ||
|  | + (void)runNowOrWhenAppWillBecomeReady:(AppReadyBlock)block | ||
|  | { | ||
|  |     DispatchMainThreadSafe(^{ | ||
|  |         [self.sharedManager runNowOrWhenAppWillBecomeReady:block]; | ||
|  |     }); | ||
|  | } | ||
|  | 
 | ||
|  | - (void)runNowOrWhenAppWillBecomeReady:(AppReadyBlock)block | ||
|  | { | ||
|  |     if (CurrentAppContext().isRunningTests) { | ||
|  |         // We don't need to do any "on app ready" work in the tests. | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (self.isAppReady) { | ||
|  |         block(); | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     [self.appWillBecomeReadyBlocks addObject:block]; | ||
|  | } | ||
|  | 
 | ||
|  | + (void)runNowOrWhenAppDidBecomeReady:(AppReadyBlock)block | ||
|  | { | ||
|  |     DispatchMainThreadSafe(^{ | ||
|  |         [self.sharedManager runNowOrWhenAppDidBecomeReady:block]; | ||
|  |     }); | ||
|  | } | ||
|  | 
 | ||
|  | - (void)runNowOrWhenAppDidBecomeReady:(AppReadyBlock)block | ||
|  | { | ||
|  |     if (CurrentAppContext().isRunningTests) { | ||
|  |         // We don't need to do any "on app ready" work in the tests. | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (self.isAppReady) { | ||
|  |         block(); | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     [self.appDidBecomeReadyBlocks addObject:block]; | ||
|  | } | ||
|  | 
 | ||
|  | + (void)setAppIsReady | ||
|  | { | ||
|  |     [self.sharedManager setAppIsReady]; | ||
|  | } | ||
|  | 
 | ||
|  | - (void)setAppIsReady | ||
|  | { | ||
|  |     self.isAppReady = YES; | ||
|  | 
 | ||
|  |     [self runAppReadyBlocks]; | ||
|  | } | ||
|  | 
 | ||
|  | - (void)runAppReadyBlocks | ||
|  | { | ||
|  |     NSArray<AppReadyBlock> *appWillBecomeReadyBlocks = [self.appWillBecomeReadyBlocks copy]; | ||
|  |     [self.appWillBecomeReadyBlocks removeAllObjects]; | ||
|  |     NSArray<AppReadyBlock> *appDidBecomeReadyBlocks = [self.appDidBecomeReadyBlocks copy]; | ||
|  |     [self.appDidBecomeReadyBlocks removeAllObjects]; | ||
|  | 
 | ||
|  |     // We invoke the _will become_ blocks before the _did become_ blocks. | ||
|  |     for (AppReadyBlock block in appWillBecomeReadyBlocks) { | ||
|  |         block(); | ||
|  |     } | ||
|  |     for (AppReadyBlock block in appDidBecomeReadyBlocks) { | ||
|  |         block(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | NS_ASSUME_NONNULL_END |