gpt4 book ai didi

ios - 如何在 Swift 中 stub URLSession?

转载 作者:搜寻专家 更新时间:2023-10-31 19:27:29 25 4
gpt4 key购买 nike

我一直在关注这个tutorial stub URLSessionThe example通过创建协议(protocol)并扩展现有的 URLSession 来完成。

protocol URLSessionProtocol {
typealias DataTaskResult = (Data?, URLResponse?, Error?) -> Void
func dataTask(with request: NSURLRequest, completionHandler: @escaping DataTaskResult) -> URLSessionDataTaskProtocol
}

extension URLSession: URLSessionProtocol {
func dataTask(with request: NSURLRequest, completionHandler: @escaping DataTaskResult) -> URLSessionDataTaskProtocol {
return dataTask(with: request, completionHandler: completionHandler) as URLSessionDataTaskProtocol
}
}

单元测试按预期工作。但是当我尝试运行真实的东西时, URLSession -> datatask() 进入无限循环并崩溃。似乎是 datatask() 正在调用自己。

请问我忽略了什么?

更新:

protocol URLSessionDataTaskProtocol {
var originalRequest: URLRequest? { get }
func resume()
}

extension URLSessionDataTask: URLSessionDataTaskProtocol {}

最佳答案

我终于找到了解决方案。这很迷人,因为我们只见树木不见森林。有两个问题:

1) 似乎 Swift 4 已经将 dataTask(with: NSURLRequest) 的签名更改为 dataTask(with: URLRequest)

因此,我的开头问题中的行只会匹配协议(protocol)的 func 签名,并且它永远不会命中 URLSession 内的 dataTask,因此会出现无限循环。为了解决这个问题,我不得不将 NSURLRequest 更改为 URLRequest 并相应地重构代码。

2) 签名仍然模糊,因此最好先将结果存储为 dataTask,然后转换为 URLSessionDataTask,然后返回变量。

Swift 4 的新重构代码:

typealias DataTaskResult = (Data?, URLResponse?, Error?) -> Void

protocol URLSessionProtocol {
func dataTask(with request: URLRequest, completionHandler: @escaping DataTaskResult) -> URLSessionDataTaskProtocol
}

extension URLSession: URLSessionProtocol {
func dataTask(with request: URLRequest, completionHandler: @escaping DataTaskResult) -> URLSessionDataTaskProtocol {
let task:URLSessionDataTask = dataTask(with: request, completionHandler: {
(data:Data?, response:URLResponse?, error:Error?) in completionHandler(data,response,error) }) as URLSessionDataTask
return task
}
}

我还发现我必须将 URLSession.shared 作为单例而不是 URLSession() 注入(inject),否则它可能会崩溃。

关于ios - 如何在 Swift 中 stub URLSession?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49508230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com