ios - 如何调配 NSURLConnection 类的 init 方法

标签 ios swift swizzling method-swizzling

我想调整 NSURLConnection 类的 init 初始化方法,我已经尝试过这段代码,但它似乎对我不起作用

extension NSURLConnection{
public override class func initialize() {
    struct Static {
        static var token: dispatch_once_t = 0
    }
    dispatch_once(&Static.token) {
        let originalSelector = Selector("init:delegate:startImmediately:")
        let swizzledSelector = Selector("my_init:delegate:startImmediately:")

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling
func my_init(request: NSURLRequest, delegate: AnyObject?, startImmediately: Bool){
 print("Inside Swizzled Method")
}
}

这是我从我的 View Controller 发起的请求

let testPoint: String = "www.google.com"
    guard let url = NSURL(string: testPoint) else {
        print("Error: cannot create URL")
        return
    }
    let urlRequest = NSURLRequest(URL: url)
    let conn = NSURLConnection(request: urlRequest, delegate: self, startImmediately: true)

最佳答案

extension NSURLConnection{
public override class func initialize() {
    struct Static {
        static var token: dispatch_once_t = 0
    }

    if self !== NSURLConnection.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("initWithRequest:delegate:startImmediately:")
        let swizzledSelector = Selector("initWithTest:delegate:startImmediately:")

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling
convenience init(test: NSURLRequest, delegate: AnyObject?, startImmediately: Bool){
    print("Inside Swizzled Method")
    self.init()
}
}

关于ios - 如何调配 NSURLConnection 类的 init 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35548651/

相关文章:

iphone - 替换运行时从 XIB 加载的 UIImage 的内容

c# - HLSL Swizzle - 在 C# 中

ios - 设置 iOS MPMusicPlayerController 相对于 AVAudioPlayer 的音量

ios - 按键名在字典数组中搜索

ios - 从命令行导入 xcode 方案

ios - 如何计算 Swift 中选定的 UITableView 行数。在 indexPathForSelectedRow 中可选

Swift 泛型参数不能绑定(bind)到非@objc 协议(protocol)

ios - 为什么 Swift 同时具有 NSDictionary 和 Dictionary 类?

ios - Swift:如何存储用户偏好?

iOS 静态库不起作用