- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想模拟 URLSession
,并返回一个模拟的 URLSessionDataTask
。
为了模拟 URLSession
我创建了一个协议(protocol)
protocol URLSessionProtocol {
func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
}
然后 URLSession
可以符合扩展
extension URLSession: URLSessionProtocol {}
现在我想对 URLSessionDataTask
做同样的事情,因此为它实现一个类似的协议(protocol)和扩展。我需要这样做,因为我调用 URLSession
的方式需要使用 func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void ) -> URLSessionDataTask
protocol URLSessionDataTaskProtocol {
func resume()
}
extension URLSessionDataTask: URLSessionDataTaskProtocol {}
那么我的 URLSessionDataTask
mock 设置如下:
class URLSessionMock: URLSessionProtocol {
typealias CompletionHandler = (Data?, URLResponse?, Error?) -> Void
// data and error can be set to provide data or an error
var data: Data?
var error: Error?
func dataTask(
with url: URL,
completionHandler: @escaping CompletionHandler
) -> URLSessionDataTask {
let data = self.data
let error = self.error
return URLSessionDataTaskMock {
completionHandler(data, nil, error)
}
}
}
我的 URLSessionDataTaskMock
呈现:
class URLSessionDataTaskMock: URLSessionDataTaskProtocol {
private let closure: () -> Void
init(closure: @escaping () -> Void) {
self.closure = closure
}
// override resume and call the closure
func resume() {
closure()
}
}
不起作用,因为 URLSessionProtocol
中的 URLSessionDataTaskMock
不是正确的返回类型 - 我需要返回一个 URLSessionDataTask
。
我无法将我的 URLSessionDataTaskMock
转换为 URLSessionDataTask
,因为类型不相关。
如何从我的 URLSessionProtocol
返回我的 URLSessionDataTaskMock
?
最佳答案
你或许可以逃脱这样的事情。关键是您的 URLSession 协议(protocol)中的关联类型
protocol URLSessionProtocol {
associatedtype DataTaskType
func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> DataTaskType
}
extension URLSession: URLSessionProtocol {}
protocol URLSessionDataTaskProtocol {
func resume()
}
extension URLSessionDataTask: URLSessionDataTaskProtocol {}
class URLSessionDataTaskMock: URLSessionDataTaskProtocol {
typealias CompletionHandler = URLSessionMock.CompletionHandler
private let completion: CompletionHandler
init(completion: @escaping CompletionHandler) {
self.completion = completion
}
func resume() {
// create some data
completion(nil, nil, nil)
}
}
class URLSessionMock: URLSessionProtocol {
typealias CompletionHandler = (Data?, URLResponse?, Error?) -> Void
// data and error can be set to provide data or an error
var data: Data?
var error: Error?
func dataTask(
with url: URL,
completionHandler: @escaping CompletionHandler
) -> URLSessionDataTaskMock {
return URLSessionDataTaskMock(completion: completionHandler)
}
}
关于swift - 模拟 URLSession 以返回模拟的 URLSessionDataTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60985240/
我正在使用 URLSessionDataTask 下载视频并播放它们(我需要缓存,所以我正在使用 func urlSession(_ session: URLSession, dataTask: UR
每次我收到以下错误: jsonError::Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 1."
使用 Swift 4,我有这段代码尝试向 REST API 发出 POST 请求: spinner.startAnimation(self) btnOk.isEnabled = false btnCa
我想模拟 URLSession,并返回一个模拟的 URLSessionDataTask。 为了模拟 URLSession 我创建了一个协议(protocol) protocol URLSessionP
我想模拟 URLSession,并返回一个模拟的 URLSessionDataTask。 为了模拟 URLSession 我创建了一个协议(protocol) protocol URLSessionP
我有一个 URLSessionDataTask 实例,我想知道操作何时开始(一个 Date 对象),这样我就可以计算已经过了多少时间。 我在 Apple 的文档 (https://developer.
我目前正在尝试为 URI 创建一个 URLSessionDataTask。因为 URI 是重定向的,所以我需要找出重定向的(最终)URL 是什么。为此,我想在 URLSessionDataDelega
我在我的 SwiftUI 应用程序中将此 APIRepresentative 类作为单例 EnvironmentObject。该类具有 @Published var,它按 ID 保存所有 Insigh
我正在尝试使用 URLSessionDataTask 访问我的后端 API。其中一部分包括访问使用 Safari 存储的 cookie。 例如http://api.example.com/v1/get
我有一个简单的应用程序,我以这种方式从存储在我自己的服务器中的 JSON 文件中获取数据 - 我正在使用 SwiftyJSON : func queryData(_ fileName:String)
我遇到了这个奇怪的问题,我无法对我不基于 GraphQL 控制的 REST 服务执行简单的 POST 请求。 问题是,无论我在 URLRequest 类的 httpMethod 属性中设置什么,它总是
基本上我有一些 JSON 数据,我希望从一堆 URL 中检索(全部来自同一主机),但是我只能大约每 2 秒至少请求一次此数据,并且一次只能请求一个,否则我会被服务器“时间禁止”。正如您将在下面看到的;
我是一名优秀的程序员,十分优秀!