URLMrotocol实现中的NSMutableURLRequest和URLRequest之间的比较

时间:2018-04-13 10:04:10

标签: swift casting nsurlprotocol

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值类型,并导致它与其上的属性存储失去关联。

谢谢

0 个答案:

没有答案