Обойти ObjC для Свифтского моста с KVC? - PullRequest
0 голосов
/ 05 июня 2019

Недавно в нашем приложении произошел сбой:

EXC_BREAKPOINT 0x00000001c5c8986c
static URLRequest._unconditionallyBridgeFromObjectiveC(_:)

Он исходит из политики принятия решений в WebView, где мы получаем доступ к свойству запроса:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
   let req = navigationAction.sourceFrame.request
}

Я считаю, что проблема в этой строке в быстрой lib: https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/URLRequest.swift#L298

Здесь нет охранников, и кажется, что на стороне объекта возможно, что запрос равен нулю.

Мой вопрос касается того, как обойти объект на быстром мосту. Будет ли KVC избежать этого?

if let req = navigationAction.sourceFrame.value(forKey: "request") as NSURLRequest {
    //do stuff
}

Если нет способа обойти стремительный мост, это крушение, с которым нам придется жить? Это происходит не слишком часто, но достаточно, чтобы мы хотели его исправить.

1 Ответ

1 голос
/ 05 июня 2019

Я думаю, вы правы, предполагая, что request равно nil, когда возникает ошибка. Подобная проблема описана здесь .
Так как URLRequest.swift, как определено в apple/swift-corelibs-foundation, то, что указано вами, окончательно завершится сбоем, если запрос nil, его нельзя использовать в этой ситуации.
Одна альтернатива - использовать КВО, поскольку func value(forKey key: String) -> Any? может вернуть nil значения, см. здесь .
Однако вы можете использовать его, только если объект, в котором вызывается функция, принял протокол NSKeyValueCoding, который гарантирован, если объект является подклассом NSObject, что я не могу сказать из вашего фрагмента кода.
Но так как вы предложили это уже в своем вопросе, вы пробовали это?

...