Swift - 如何正确继承 NSMutableURLRequest?
Swift - How to subclass NSMutableURLRequest correctly?
我有如下子类 NSMutableURLRequest:
class CustomNSMutableURLRequest: NSMutableURLRequest {
convenience init(url : URL) {
self.init(url: url)
self.httpShouldHandleCookies = false
self.httpMethod = "GET"
print("Custom Request!")
}
}
这会导致 self.init(url: url)
行出现无限循环。使用 super
而不是 self
也不起作用。我该如何解决这个问题?
遗憾的是,您不能在子类中重写确切的便利初始值设定项。
你可能需要这样写:
class CustomNSMutableURLRequest: NSMutableURLRequest {
convenience init(url : URL) {
self.init(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 60)
self.httpShouldHandleCookies = false
self.httpMethod = "GET"
print("Custom Request!")
}
}
但我不确定是否真的需要子类化,我会像这样向 URLRequest
添加一些工厂方法:
extension URLRequest {
public static func customRequest(url: URL) -> URLRequest {
var result = URLRequest(url: url)
result.httpShouldHandleCookies = false
result.httpMethod = "GET"
print("Custom Request!")
return result
}
}
根据我的经验,您不能安全地将 NSURLRequest 子类化。如果这样做,您将在 NSURLSession 中遇到令人着迷的不当行为,其中对一个请求的响应会错误地关联到不同的请求。
寻找不同的方式,例如使用为NSURLProtocol设计的方法将任意字符串附加到请求中,并附加一个包含UUID的字符串,然后将其用作字典键。或者将会话标识符与每个任务标识符结合使用。不管怎样。
我有如下子类 NSMutableURLRequest:
class CustomNSMutableURLRequest: NSMutableURLRequest {
convenience init(url : URL) {
self.init(url: url)
self.httpShouldHandleCookies = false
self.httpMethod = "GET"
print("Custom Request!")
}
}
这会导致 self.init(url: url)
行出现无限循环。使用 super
而不是 self
也不起作用。我该如何解决这个问题?
遗憾的是,您不能在子类中重写确切的便利初始值设定项。
你可能需要这样写:
class CustomNSMutableURLRequest: NSMutableURLRequest {
convenience init(url : URL) {
self.init(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 60)
self.httpShouldHandleCookies = false
self.httpMethod = "GET"
print("Custom Request!")
}
}
但我不确定是否真的需要子类化,我会像这样向 URLRequest
添加一些工厂方法:
extension URLRequest {
public static func customRequest(url: URL) -> URLRequest {
var result = URLRequest(url: url)
result.httpShouldHandleCookies = false
result.httpMethod = "GET"
print("Custom Request!")
return result
}
}
根据我的经验,您不能安全地将 NSURLRequest 子类化。如果这样做,您将在 NSURLSession 中遇到令人着迷的不当行为,其中对一个请求的响应会错误地关联到不同的请求。
寻找不同的方式,例如使用为NSURLProtocol设计的方法将任意字符串附加到请求中,并附加一个包含UUID的字符串,然后将其用作字典键。或者将会话标识符与每个任务标识符结合使用。不管怎样。