我想调整 URLSession 类方法 dataTask 但无法完成。
我在objective-c中尝试了这种混合,并且它工作正常,现在我想在swift 3中实现它但没有得到任何东西。
我参考 了这个链接,但它在 swift 3 中不起作用。
请帮我。
我想调整 URLSession 类方法 dataTask 但无法完成。
我在objective-c中尝试了这种混合,并且它工作正常,现在我想在swift 3中实现它但没有得到任何东西。
我参考 了这个链接,但它在 swift 3 中不起作用。
请帮我。
我们可以按如下方式快速调整方法
let selectorfirst = #selector(ClassName.function(_:))
let swizzledFunction = #selector(ClassName.function2(_:))
let method1 = class_getInstanceMethod(ClassInstance, selectorfirst)
let method2 = class_getInstanceMethod(ClassInstance, swizzledFunction)
method_exchangeImplementations(method1, method2)
//尝试像这样使用子类
class URLSessionSubClass: URLSession {
static var sharedInstance: URLSessionSubClass?
static func getSharedInstance() -> URLSessionSubClass {
if sharedInstance == nil {
sharedInstance = URLSessionSubClass()
let selectorfirst = #selector(URLSessionSubClass.function(_:))
let swizzledFunction = #selector(URLSessionSubClass.function2(_:))
let method1 = class_getInstanceMethod(self, selectorfirst)
let method2 = class_getInstanceMethod(self, swizzledFunction)
method_exchangeImplementations(method1, method2)
}
return sharedInstance!
}
}
我尝试过简单的 NSURLSession swizzling,它确实有效,但是在尝试实现 Alamorfire 和其他第三方网络 SDK 的 swizzling 时,它没有用,因为我们需要从 URLProtocol 的基础进行 swizzling,使用 swizzling 方法实现 URLSessionConfiguration.default并添加所有属性,如 startLoading、stopLoading、init 和 canInit 功能。还添加 URLSession 委托方法以返回值。
https://gist.github.com/nil-biribiri/ceead941d5b482207cb1b872c5d76a60