具有 Swift 扩展名的协议方法的默认实现
Default implementation of protocol method with Swift extension
我正在尝试使用 Swift 扩展为委托方法编写默认行为,但从未调用过。有谁知道为什么或如何以正确的方式做到这一点?
extension NSURLSessionDelegate {
public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
//default behaviour here
}
}
添加override
也不行。
根据this,
Apple 的默认实现如下所示:
extension NSURLSessionDelegate {
func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) { }
func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { }
}
我的 DataTask 调用通常如下所示:
let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
sessionConfiguration.HTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
let session = NSURLSession(configuration: sessionConfiguration)
let requestURL = NSURL(string:"https:www.google.com/blabla")
session.dataTaskWithURL(requestURL!, completionHandler: completion).resume()
其中 completion
通常是通过参数接收的 Swift 闭包。
我需要为整个应用程序中的所有 nsurlsessiontask
实现实现 URLSession(... didReceiveChallenge ...)
函数,但无法设置我的会话委托,因为我需要使用 completionHandler(如我在下面的评论中所述) ).
您可以扩展 NSURLSessionDelegate
协议以添加默认实现,但您的 NSURLSession
对象需要委托。
此委托只能使用 +sessionWithConfiguration:delegate:delegateQueue:
设置(因为委托 属性 是 read only),因此设置它的唯一方法是 subclass NSURLSession
,覆盖 +sessionWithConfiguration:
并使用委托 属性 调用初始化程序。这里的问题是您必须将所有 NSURLSession
对象替换为 MyCustomSessionClass
。对象。
我建议您创建一个 SessionCreator class,它将符合 NSURLSessionDelegate
协议并将创建 NSURLSession
对象。您仍然需要替换对象的创建,但至少该对象不是其自身的委托。
public class SessionCreator:NSObject,NSURLSessionDelegate {
//MARK: - Singleton method
class var sharedInstance :SessionCreator {
struct Singleton {
static let instance = SessionCreator()
}
return Singleton.instance
}
//MARK: - Public class method
public class func createSessionWithConfiguration (configuration:NSURLSessionConfiguration) -> NSURLSession {
return sharedInstance.createSessionWithConfiguration(configuration)
}
//MARK: - Private methods
private func createSessionWithConfiguration (configuration:NSURLSessionConfiguration) -> NSURLSession {
return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
}
//MARK: - NSURLSessionDelegate protocol conformance
public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
// Always called since it's the delegate of all NSURLSession created using createSessionWithConfiguration
}
}
// Let create a NSURLSession object :
let session = SessionCreator.createSessionWithConfiguration(NSURLSessionConfiguration())
我正在尝试使用 Swift 扩展为委托方法编写默认行为,但从未调用过。有谁知道为什么或如何以正确的方式做到这一点?
extension NSURLSessionDelegate {
public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
//default behaviour here
}
}
添加override
也不行。
根据this, Apple 的默认实现如下所示:
extension NSURLSessionDelegate {
func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) { }
func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { }
}
我的 DataTask 调用通常如下所示:
let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
sessionConfiguration.HTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
let session = NSURLSession(configuration: sessionConfiguration)
let requestURL = NSURL(string:"https:www.google.com/blabla")
session.dataTaskWithURL(requestURL!, completionHandler: completion).resume()
其中 completion
通常是通过参数接收的 Swift 闭包。
我需要为整个应用程序中的所有 nsurlsessiontask
实现实现 URLSession(... didReceiveChallenge ...)
函数,但无法设置我的会话委托,因为我需要使用 completionHandler(如我在下面的评论中所述) ).
您可以扩展 NSURLSessionDelegate
协议以添加默认实现,但您的 NSURLSession
对象需要委托。
此委托只能使用 +sessionWithConfiguration:delegate:delegateQueue:
设置(因为委托 属性 是 read only),因此设置它的唯一方法是 subclass NSURLSession
,覆盖 +sessionWithConfiguration:
并使用委托 属性 调用初始化程序。这里的问题是您必须将所有 NSURLSession
对象替换为 MyCustomSessionClass
。对象。
我建议您创建一个 SessionCreator class,它将符合 NSURLSessionDelegate
协议并将创建 NSURLSession
对象。您仍然需要替换对象的创建,但至少该对象不是其自身的委托。
public class SessionCreator:NSObject,NSURLSessionDelegate {
//MARK: - Singleton method
class var sharedInstance :SessionCreator {
struct Singleton {
static let instance = SessionCreator()
}
return Singleton.instance
}
//MARK: - Public class method
public class func createSessionWithConfiguration (configuration:NSURLSessionConfiguration) -> NSURLSession {
return sharedInstance.createSessionWithConfiguration(configuration)
}
//MARK: - Private methods
private func createSessionWithConfiguration (configuration:NSURLSessionConfiguration) -> NSURLSession {
return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
}
//MARK: - NSURLSessionDelegate protocol conformance
public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
// Always called since it's the delegate of all NSURLSession created using createSessionWithConfiguration
}
}
// Let create a NSURLSession object :
let session = SessionCreator.createSessionWithConfiguration(NSURLSessionConfiguration())