NSURLProtocol
文档说明可以设置键值并将其与请求相关联。文档称之为"标记请求"。
class func property(forKey: String, in: URLRequest)
返回与指定键关联的属性 指定的请求。
class func setProperty(Any, forKey: String, in: NSMutableURLRequest)
设置与指定键中指定键关联的属性 请求。
我的目标是:来自我MYURLProtocol
的外部,通过类/静态方法将值与请求相关联 - 然后使用请求再次将其取出。
这有效:
class func methodOnURLProtocolConcreteClass(value: Any, request: URLRequest) {
let mutableRequest = request as! NSMutableURLRequest
URLProtocol.setProperty(value, forKey: "value", in: mutableRequest)
let loadedValue = URLProtocol.property(forKey: "value", in: mutableRequest as URLRequest)
print(loadedValue) // Success!, prints out value
}
// call site
MyURLProtocol.methodOnURLProtocolConcreteClass(value: "Hello", request: request)
因此,需要进行一些转换,因为属性的getter和setter的签名使用NSMutableURLRequest
设置值,URLRequest
再次将其取出。
如果我做同样的事情,但是分散了两种方法:
class func methodOnURLProtocolConcreteClass(value: Any, request: URLRequest) {
let mutableRequest = request as! NSMutableURLRequest
URLProtocol.setProperty(value, forKey: "value", in: mutableRequest)
}
class func anotherMethodOnURLProtocolConcreteClass(request: URLRequest) {
let loadedValue = URLProtocol.property(forKey: "value", in: request)
print(loadedValue) // Failure!, loadedValue is nil
}
// call site
MyURLProtocol.methodOnURLProtocolConcreteClass(value: "Hello", request: request)
MyURLProtocol.anotherMethodOnURLProtocolConcreteClass(request: request)
所以我怀疑是从施法/转换到Swift URLRequest
到Obj-C NSMutableURLRequest
的某个地方,这个对象是"浅层复制"或类似于创建Swift值类型,并导致它与其上的属性存储失去关联。
谢谢