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
		
	
| // 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) }
 | |
|     }
 | |
| }
 |