|
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