|
91 | 91 | */ |
92 | 92 | open func sentMessage(_ selector: Selector) -> Observable<[Any]> { |
93 | 93 | MainScheduler.ensureExecutingOnScheduler() |
94 | | - checkSelectorIsObservable(selector) |
95 | 94 |
|
96 | 95 | let subject = _sentMessageForSelector[selector] |
97 | 96 |
|
98 | 97 | if let subject = subject { |
99 | 98 | return subject.asObservable() |
100 | 99 | } |
101 | 100 | else { |
102 | | - let subject = MessageDispatcher(delegateProxy: self) |
| 101 | + let subject = MessageDispatcher(selector: selector, delegateProxy: self) |
103 | 102 | _sentMessageForSelector[selector] = subject |
104 | 103 | return subject.asObservable() |
105 | 104 | } |
|
149 | 148 | */ |
150 | 149 | open func methodInvoked(_ selector: Selector) -> Observable<[Any]> { |
151 | 150 | MainScheduler.ensureExecutingOnScheduler() |
152 | | - checkSelectorIsObservable(selector) |
153 | 151 |
|
154 | 152 | let subject = _methodInvokedForSelector[selector] |
155 | 153 |
|
156 | 154 | if let subject = subject { |
157 | 155 | return subject.asObservable() |
158 | 156 | } |
159 | 157 | else { |
160 | | - let subject = MessageDispatcher(delegateProxy: self) |
| 158 | + let subject = MessageDispatcher(selector: selector, delegateProxy: self) |
161 | 159 | _methodInvokedForSelector[selector] = subject |
162 | 160 | return subject.asObservable() |
163 | 161 | } |
164 | 162 | } |
165 | 163 |
|
166 | | - private func checkSelectorIsObservable(_ selector: Selector) { |
| 164 | + fileprivate func checkSelectorIsObservable(_ selector: Selector) { |
167 | 165 | MainScheduler.ensureExecutingOnScheduler() |
168 | 166 |
|
169 | 167 | if hasWiredImplementation(for: selector) { |
170 | | - print("Delegate proxy is already implementing `\(selector)`, a more performant way of registering might exist.") |
| 168 | + print("⚠️ Delegate proxy is already implementing `\(selector)`, a more performant way of registering might exist.") |
171 | 169 | return |
172 | 170 | } |
173 | 171 |
|
174 | | - guard ((self.forwardToDelegate() as? NSObject)?.responds(to: selector) ?? false) || voidDelegateMethodsContain(selector) else { |
175 | | - rxFatalError("This class doesn't respond to selector \(selector)") |
| 172 | + if voidDelegateMethodsContain(selector) { |
| 173 | + return |
| 174 | + } |
| 175 | + |
| 176 | + // In case `_forwardToDelegate` is `nil`, it is assumed the check is being done prematurely. |
| 177 | + if !(self._forwardToDelegate?.responds(to: selector) ?? true) { |
| 178 | + print("⚠️ Using delegate proxy dynamic interception method but the target delegate object doesn't respond to the requested selector. " + |
| 179 | + "In case pure Swift delegate proxy is being used please use manual observing method by using`PublishSubject`s. " + |
| 180 | + " (selector: `\(selector)`, forwardToDelegate: `\(_forwardToDelegate ?? self)`)") |
176 | 181 | } |
177 | 182 | } |
178 | 183 |
|
|
204 | 209 | MainScheduler.ensureExecutingOnScheduler() |
205 | 210 | #endif |
206 | 211 | self._setForwardToDelegate(delegate, retainDelegate: retainDelegate) |
| 212 | + |
| 213 | + let allUsedSelectors: [Selector] = |
| 214 | + self._sentMessageForSelector.values.filter { $0.hasObservers }.map { $0.selector } + |
| 215 | + self._methodInvokedForSelector.values.filter { $0.hasObservers }.map { $0.selector } |
| 216 | + |
| 217 | + for selector in Set(allUsedSelectors) { |
| 218 | + checkSelectorIsObservable(selector) |
| 219 | + } |
| 220 | + |
207 | 221 | self.reset() |
208 | 222 | } |
209 | 223 |
|
|
250 | 264 | private let dispatcher: PublishSubject<[Any]> |
251 | 265 | private let result: Observable<[Any]> |
252 | 266 |
|
253 | | - init<P, D>(delegateProxy _delegateProxy: DelegateProxy<P, D>) { |
| 267 | + fileprivate let selector: Selector |
| 268 | + |
| 269 | + init<P, D>(selector: Selector, delegateProxy _delegateProxy: DelegateProxy<P, D>) { |
254 | 270 | weak var weakDelegateProxy = _delegateProxy |
255 | 271 |
|
256 | 272 | let dispatcher = PublishSubject<[Any]>() |
257 | 273 | self.dispatcher = dispatcher |
| 274 | + self.selector = selector |
258 | 275 |
|
259 | 276 | self.result = dispatcher |
260 | | - .do(onSubscribed: { weakDelegateProxy?.reset() }, onDispose: { weakDelegateProxy?.reset() }) |
| 277 | + .do(onSubscribed: { weakDelegateProxy?.checkSelectorIsObservable(selector); weakDelegateProxy?.reset() }, onDispose: { weakDelegateProxy?.reset() }) |
261 | 278 | .share() |
262 | 279 | .subscribeOn(mainScheduler) |
263 | 280 | } |
|
0 commit comments