请参考下面的代码段(某些与问题无关的部分将被省略)
在WebService1中,dataTask是实例变量/属性,而在WebService2中,dataTask是函数callWebService中的局部变量。
final class WebService1 {
let urlSession = URLSession(configuration: .default)
// 1. data task is a private property of PNWebService here
private var dataTask: URLSessionDataTask?
func callWebService(completion: () -> ()) {
var urlRequest = URLRequest(url: url)
dataTask = urlSession.dataTask(with: urlRequest) {
// task complete
completion()
}
dataTask?.resume()
}
}
final class WebService2 {
let urlSession = URLSession(configuration: .default)
func callWebService(completion: () -> ()) {
var urlRequest = URLRequest(url: url)
// 2. data task is a local variable here
var dataTask = urlSession.dataTask(with: url) {
// task complete
completion()
}
dataTask.resume()
}
}
客户以通常的方式呼叫这两项服务:
let ws1 = WebService1()
ws1.callWebService() {
print("1. complete")
}
let ws2 = WebService2()
ws2.callWebService() {
print("2. complete")
}
Q1)谁对WebService2中的dataTask拥有很强的引用,以便在调用完成处理程序之前不会取消分配它?
Q2)从客户端的角度来看,WebService1和WebService2在运行时有什么区别?
答案 0 :(得分:0)
您是在问哪种模式正确吗?都不行URLSession拥有数据任务并在您第一次resume
时就对其进行管理,因此,除非您打算进行 any 引用,否则无需保留对它的引用。使用该参考进行其他操作,例如进一步配置任务或稍后取消操作。通常说来就足够了,而且很平常
urlSession.dataTask(with:url) { data, resp, err in
// whatever
}.resume()