@@ -34,7 +34,11 @@ final class ViewControllerObserverFactory<T: ViewControllerObserver, S: ScreenMe
3434 private let observerMaker : ( S . ScreenIdentifier ) -> T
3535
3636 private func observer( for viewController: UIViewController ) -> T ? {
37- precondition ( Thread . isMainThread)
37+ if PerformanceMonitoring . experiments. observersOnBackgroundQueue {
38+ dispatchPrecondition ( condition: . onQueue( PerformanceMonitoring . queue) )
39+ } else {
40+ precondition ( Thread . isMainThread)
41+ }
3842
3943 if let observer = ViewControllerObserverFactoryHelper . existingObserver ( for: viewController, identifier: T . identifier) as? T {
4044 return observer
@@ -51,27 +55,63 @@ final class ViewControllerObserverFactory<T: ViewControllerObserver, S: ScreenMe
5155 }
5256
5357 func beforeInit( viewController: UIViewController ) {
54- observer ( for: viewController) ? . beforeInit ( viewController: viewController)
58+ if PerformanceMonitoring . experiments. observersOnBackgroundQueue {
59+ PerformanceMonitoring . queue. async {
60+ self . observer ( for: viewController) ? . beforeInit ( viewController: viewController)
61+ }
62+ } else {
63+ observer ( for: viewController) ? . beforeInit ( viewController: viewController)
64+ }
5565 }
5666
5767 func beforeViewDidLoad( viewController: UIViewController ) {
58- observer ( for: viewController) ? . beforeViewDidLoad ( viewController: viewController)
68+ if PerformanceMonitoring . experiments. observersOnBackgroundQueue {
69+ PerformanceMonitoring . queue. async {
70+ self . observer ( for: viewController) ? . beforeViewDidLoad ( viewController: viewController)
71+ }
72+ } else {
73+ observer ( for: viewController) ? . beforeViewDidLoad ( viewController: viewController)
74+ }
5975 }
6076
6177 func afterViewDidAppear( viewController: UIViewController ) {
62- observer ( for: viewController) ? . afterViewDidAppear ( viewController: viewController)
78+ if PerformanceMonitoring . experiments. observersOnBackgroundQueue {
79+ PerformanceMonitoring . queue. async {
80+ self . observer ( for: viewController) ? . afterViewDidAppear ( viewController: viewController)
81+ }
82+ } else {
83+ observer ( for: viewController) ? . afterViewDidAppear ( viewController: viewController)
84+ }
6385 }
6486
6587 func beforeViewWillDisappear( viewController: UIViewController ) {
66- observer ( for: viewController) ? . beforeViewWillDisappear ( viewController: viewController)
88+ if PerformanceMonitoring . experiments. observersOnBackgroundQueue {
89+ PerformanceMonitoring . queue. async {
90+ self . observer ( for: viewController) ? . beforeViewWillDisappear ( viewController: viewController)
91+ }
92+ } else {
93+ observer ( for: viewController) ? . beforeViewWillDisappear ( viewController: viewController)
94+ }
6795 }
6896
6997 func afterViewWillAppear( viewController: UIViewController ) {
70- observer ( for: viewController) ? . afterViewWillAppear ( viewController: viewController)
98+ if PerformanceMonitoring . experiments. observersOnBackgroundQueue {
99+ PerformanceMonitoring . queue. async {
100+ self . observer ( for: viewController) ? . afterViewWillAppear ( viewController: viewController)
101+ }
102+ } else {
103+ observer ( for: viewController) ? . afterViewWillAppear ( viewController: viewController)
104+ }
71105 }
72106
73107 func beforeViewDidDisappear( viewController: UIViewController ) {
74- observer ( for: viewController) ? . beforeViewDidDisappear ( viewController: viewController)
108+ if PerformanceMonitoring . experiments. observersOnBackgroundQueue {
109+ PerformanceMonitoring . queue. async {
110+ self . observer ( for: viewController) ? . beforeViewDidDisappear ( viewController: viewController)
111+ }
112+ } else {
113+ observer ( for: viewController) ? . beforeViewDidDisappear ( viewController: viewController)
114+ }
75115 }
76116
77117 static var identifier : AnyObject {
@@ -134,13 +174,20 @@ class ViewControllerObserverCollection: ViewControllerObserver {
134174/// Non-generic helper for generic `ViewControllerObserverFactory`. To put all the static methods and vars there.
135175final class ViewControllerObserverFactoryHelper {
136176 static func existingObserver( for viewController: UIViewController , identifier: AnyObject ) -> Any ? {
137- var vc : UIViewController ? = viewController
138- while let current = vc {
177+ if PerformanceMonitoring . experiments. observersOnBackgroundQueue {
139178 let tPointer = unsafeBitCast ( identifier, to: UnsafeRawPointer . self)
140- if let result = objc_getAssociatedObject ( current , tPointer) {
179+ if let result = objc_getAssociatedObject ( viewController , tPointer) {
141180 return result
142181 }
143- vc = current. parent
182+ } else {
183+ var vc : UIViewController ? = viewController
184+ while let current = vc {
185+ let tPointer = unsafeBitCast ( identifier, to: UnsafeRawPointer . self)
186+ if let result = objc_getAssociatedObject ( current, tPointer) {
187+ return result
188+ }
189+ vc = current. parent
190+ }
144191 }
145192
146193 return nil
0 commit comments