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.
		
		
		
		
		
			
		
			
	
	
		
			74 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Swift
		
	
| 
											2 years ago
										 | // Copyright © 2024 Rangeproof Pty Ltd. All rights reserved. | ||
|  | 
 | ||
|  | import Foundation | ||
|  | import SessionUtilitiesKit | ||
|  | 
 | ||
|  | // MARK: - Singleton | ||
|  | 
 | ||
|  | public extension Singleton { | ||
|  |     // FIXME: This will be reworked to be part of dependencies in the Groups Rebuild branch | ||
|  |     fileprivate static var _appReadiness: Atomic<AppReadiness> = Atomic(AppReadiness()) | ||
|  |     static var appReadiness: AppReadiness { _appReadiness.wrappedValue } | ||
|  | } | ||
|  | 
 | ||
|  | // MARK: - AppReadiness | ||
|  | 
 | ||
|  | public class AppReadiness { | ||
|  |     public private(set) var isAppReady: Bool = false | ||
|  |     private var appWillBecomeReadyBlocks: Atomic<[() -> ()]> = Atomic([]) | ||
|  |     private var appDidBecomeReadyBlocks: Atomic<[() -> ()]> = Atomic([]) | ||
|  |      | ||
|  |     public func setAppReady() { | ||
|  |         guard Thread.isMainThread else { | ||
|  |             DispatchQueue.main.async { [weak self] in self?.setAppReady() } | ||
|  |             return | ||
|  |         } | ||
|  |          | ||
|  |         // Update the flag | ||
|  |         isAppReady = true | ||
|  |          | ||
|  |         // Trigure the closures | ||
|  |         let willBecomeReadyClosures: [() -> ()] = appWillBecomeReadyBlocks.wrappedValue | ||
|  |         let didBecomeReadyClosures: [() -> ()] = appDidBecomeReadyBlocks.wrappedValue | ||
|  |         appWillBecomeReadyBlocks.mutate { $0 = [] } | ||
|  |         appDidBecomeReadyBlocks.mutate { $0 = [] } | ||
|  |          | ||
|  |         willBecomeReadyClosures.forEach { $0() } | ||
|  |         didBecomeReadyClosures.forEach { $0() } | ||
|  |     } | ||
|  |      | ||
|  |     public func invalidate() { | ||
|  |         isAppReady = false | ||
|  |     } | ||
|  |      | ||
|  |     public func runNowOrWhenAppWillBecomeReady(closure: @escaping () -> ()) { | ||
|  |         // We don't need to do any "on app ready" work in the tests. | ||
|  |         guard !SNUtilitiesKitConfiguration.isRunningTests else { return } | ||
|  |         guard !isAppReady else { | ||
|  |             guard Thread.isMainThread else { | ||
|  |                 DispatchQueue.main.async { [weak self] in self?.runNowOrWhenAppWillBecomeReady(closure: closure) } | ||
|  |                 return | ||
|  |             } | ||
|  |              | ||
|  |             return closure() | ||
|  |         } | ||
|  |          | ||
|  |         appWillBecomeReadyBlocks.mutate { $0.append(closure) } | ||
|  |     } | ||
|  |      | ||
|  |     public func runNowOrWhenAppDidBecomeReady(closure: @escaping () -> ()) { | ||
|  |         // We don't need to do any "on app ready" work in the tests. | ||
|  |         guard !SNUtilitiesKitConfiguration.isRunningTests else { return } | ||
|  |         guard !isAppReady else { | ||
|  |             guard Thread.isMainThread else { | ||
|  |                 DispatchQueue.main.async { [weak self] in self?.runNowOrWhenAppDidBecomeReady(closure: closure) } | ||
|  |                 return | ||
|  |             } | ||
|  |              | ||
|  |             return closure() | ||
|  |         } | ||
|  |          | ||
|  |         appDidBecomeReadyBlocks.mutate { $0.append(closure) } | ||
|  |     } | ||
|  | } |