@@ -42,8 +42,8 @@ public class UIViewControllerRouter {
4242
4343 static let shared = UIViewControllerRouter ( )
4444 private let urlRouter = URLRouter < UIViewController > ( )
45- private var interceptors : [ InterceptorType ] = [ ]
46- private( set) var errorInterceptor = ErrorInterceptor ( )
45+ private var interceptors : [ RouteInterceptor ] = [ ]
46+ private( set) var errorHandler : RouteErrorHandling ?
4747 private var lock = pthread_rwlock_t ( )
4848
4949 init ( ) {
@@ -57,7 +57,7 @@ public class UIViewControllerRouter {
5757
5858 func autoRegisterIfNeed( ) {
5959 if isNeedAutoRegister {
60- DispatchQueue . init ( label: " com.router.register " ) . async {
60+ DispatchQueue ( label: " com.router.register " ) . async {
6161 self . registerIfNeed ( )
6262 }
6363 }
@@ -88,7 +88,7 @@ public class UIViewControllerRouter {
8888 pthread_rwlock_unlock ( & lock)
8989 }
9090
91- func handleInterceptor( interceptors: [ InterceptorType ] , components: URLComponents , completionHandler: @escaping RouteCompletionHandler < UIViewController > ) {
91+ func handleInterceptor( interceptors: [ RouteInterceptor ] , components: URLComponents , completionHandler: @escaping RouteCompletionHandler < UIViewController > ) {
9292 if interceptors. isEmpty {
9393 return
9494 }
@@ -129,125 +129,13 @@ public class UIViewControllerRouter {
129129 }
130130 }
131131
132- public func register< T : InterceptorType > ( interceptors: [ T ] ) {
132+ public func register( interceptors: [ RouteInterceptor ] ) {
133133 let last = self . interceptors. removeLast ( )
134134 self . interceptors. append ( contentsOf: interceptors)
135135 self . interceptors. append ( last)
136136 }
137-
138- public func registerErrorInterceptors( _ interceptor: ErrorInterceptor ) {
139- self . errorInterceptor = interceptor
140- }
141- }
142-
143- public final class UIRouter {
144- private var viewController : UIViewController ?
145-
146- private let url : URLComponentsConvertible
147-
148- init ( url: URLComponentsConvertible ) {
149- self . url = url
150- }
151-
152- func asyncGetViewController( _ completionHandler: @escaping RouteCompletionHandler < UIViewController > ) {
153- if let vc = viewController {
154- completionHandler ( . success( vc) )
155- return
156- }
157- UIViewControllerRouter . shared. route ( url: url) { result in
158- switch result {
159- case . success( let vc) :
160- self . viewController = vc
161- case . failure( let error) :
162- UIViewControllerRouter . shared. errorInterceptor. handle ( error: error)
163- }
164- completionHandler ( result)
165- }
166- }
167-
168- private func getVisibleViewController( ) -> UIViewController ? {
169- let keyWindow : UIWindow ?
170- if #available( iOS 13 . 0 . 0 , * ) {
171- keyWindow = UIApplication . shared. connectedScenes
172- . filter ( { $0. activationState == . foregroundActive} )
173- . map ( { $0 as? UIWindowScene } )
174- . compactMap ( { $0} )
175- . first? . windows
176- . filter ( \. isKeyWindow) . first
177- } else {
178- keyWindow = UIApplication . shared. keyWindow
179- }
180- return keyWindow? . rootViewController? . visibleViewController ( )
181- }
182-
183- public func push( by root: UIViewController ? = nil , animated: Bool = true , completionHandler: RouteCompletionHandler < UIViewController > ? = nil ) {
184- asyncGetViewController { result in
185- switch result {
186- case . success( let vc) :
187- let root = root ?? self . getVisibleViewController ( )
188- root? . navigationController? . pushViewController ( vc, animated: animated)
189- completionHandler ? ( . success( vc) )
190- case . failure( let error) :
191- completionHandler ? ( . failure( error) )
192- }
193- }
194- }
195-
196- public func present( by root: UIViewController ? = nil , animated: Bool = true , completionHandler: RouteCompletionHandler < UIViewController > ? = nil ) {
197- asyncGetViewController { result in
198- switch result {
199- case . success( let vc) :
200- let root = root ?? self . getVisibleViewController ( )
201- root? . present ( vc, animated: animated, completion: {
202- completionHandler ? ( . success( vc) )
203- } )
204- case . failure( let error) :
205- completionHandler ? ( . failure( error) )
206- }
207- }
208- }
209-
210- public func presentWithNavigationController< N: UINavigationController > ( _ type: N . Type , by root: UIViewController ? = nil , animated: Bool = true , completionHandler: RouteCompletionHandler < UIViewController > ? = nil ) {
211- asyncGetViewController { result in
212- switch result {
213- case . success( let vc) :
214- let root = root ?? self . getVisibleViewController ( )
215- root? . present ( type. init ( rootViewController: vc) , animated: animated, completion: {
216- completionHandler ? ( . success( vc) )
217- } )
218- case . failure( let error) :
219- completionHandler ? ( . failure( error) )
220- }
221- }
222- }
223- }
224-
225- public extension UIApplication {
226-
227- var router : UIViewControllerRouter {
228- . shared
229- }
230-
231- @inline ( __always)
232- func route( url: URLComponentsConvertible ) -> UIRouter {
233- UIRouter ( url: url)
234- }
235- }
236137
237- extension UIViewController {
238- func visibleViewController( ) -> UIViewController ? {
239- if let presentedViewController = self . presentedViewController {
240- return presentedViewController. visibleViewController ( )
241- }
242- if let navigationController = self as? UINavigationController {
243- return navigationController. visibleViewController
244- }
245- if let tabBarController = self as? UITabBarController {
246- return tabBarController. selectedViewController? . visibleViewController ( )
247- }
248- if isViewLoaded {
249- return self
250- }
251- return nil
138+ public func registerErrorHandler( _ handler: RouteErrorHandling ) {
139+ errorHandler = handler
252140 }
253141}
0 commit comments