Переменная экземпляра URLSessionTask против локальной переменной - кому принадлежит ссылка? - PullRequest
0 голосов
/ 08 июля 2019

Пожалуйста, обратитесь к фрагменту кода ниже (некоторые части, не относящиеся к вопросу, опущены)

В 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) Кто владеет строгой ссылкой на dataTask в WebService2, чтобы он не был освобожден до вызова обработчика завершения?

Q2) С точки зрения клиента, в чем разница во время выполнения между WebService1 и WebService2?

1 Ответ

0 голосов
/ 08 июля 2019

Вы спрашиваете, какая модель верна? Ни. URLSession владеет задачей с данными и управляет ее памятью, как только вы resume выполняете ее впервые, поэтому вам не нужно сохранять любую ссылку на нее, если вы не планируете делать что-то еще с этой ссылкой, такой как дальнейшая настройка задачи или последующая отмена операции. Как правило, достаточно и вполне обычно говорить

urlSession.dataTask(with:url) { data, resp, err in
    // whatever
}.resume()
...