1

我想调整 URLSession 类方法 dataTask 但无法完成。

我在objective-c中尝试了这种混合,并且它工作正常,现在我想在swift 3中实现它但没有得到任何东西。

我参考 了这个链接,但它在 swift 3 中不起作用。

请帮我。

4

2 回答 2

1

我们可以按如下方式快速调整方法

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!
}
}
于 2017-05-01T11:31:18.313 回答
0

我尝试过简单的 NSURLSession swizzling,它确实有效,但是在尝试实现 Alamorfire 和其他第三方网络 SDK 的 swizzling 时,它没有用,因为我们需要从 URLProtocol 的基础进行 swizzling,使用 swizzling 方法实现 URLSessionConfiguration.default并添加所有属性,如 startLoading、stopLoading、init 和 canInit 功能。还添加 URLSession 委托方法以返回值。

https://gist.github.com/nil-biribiri/ceead941d5b482207cb1b872c5d76a60

于 2019-06-22T05:49:08.227 回答