Salut Bob,
Je lutte toujours, mais toujours sans solution.
Les solutions de ce post ne marchent pas : ios - URL session initilazition issue - Stack Overflow
D’autres faisceaux convergent vers ce post : Subclassing factory methods of URLSession in Swift lequel conclu :
According to Swift Language Guide rule 1 for Automatic Initializer Inheritance:
* *If your subclass doesn’t define any designated initializers, it * *automatically inherits all of its superclass designated initializers.* *
So, technically MyURLSession
should inherit all designated initializers, but it doesn’t, and it only inherits init()
from NSObject
. Looking into documentation of URLSession
:
public /not inherited/ init(configuration: URLSessionConfiguration)
There is nothing visible aside from the comment, that it is not inherited. Looking into it’s Objective-C definitions, we can notice that they are not initializers, but rather factory methods, which are imported into Swift as inits.
```
*+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration )configuration;
*+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration
So the question is, how to override and/or correctly call these methods of superclass in initialization?
Comment implémenter ce conseil de Tim :
Please use +[NSURLSession sessionWithConfiguration:] or other class methods to create instances
Si quelqu’un est assez pointu pour me commenter ça, je prends, car pour l’instant je ne sais pas faire. Je rappelle que le code marche super bien, c’est juste une question d’éradiquer ces warnings jaunes non bloquants (mais éliminatoires à l’examen)
Merci. Je cherche et reste à l’écoute.
--------------------------------------------------------------------------------------------------------
DIMANCHE 13 NOVEMBRE 17H42 (j’écris là suite à la limitation de 3 réponses)
-----------------------------------------------------------------------------------------------------------
Salut Bob,
J’avance, j’avance (vers le ravin?! Peut-être !) mais j’avance.
J’ai posté le message suivant :
qui m’a redirigé vers :
J’ai pu implémenter (non sans mal) la réponse cochée en vert et wrapper NSURSession dans une sous-classe. Et le résultat est celui attendu
Thus you will have more control and customization options.
Au passage, comme dans toute classe qui hérite, il faut prévoir un super.init de la classe parente. Après bien tracas, le super.init qui a marché est le suivant :
super.init(monParamètreWrapper: URLSession(configuration: .default))
pour éviter ce message d’erreur :
Cannot convert value of type 'URLSessionDataTask.Type' to expected argument type 'URLSessionDataTask'
Bravo ! J’ai voulu reconduire le même principe avec le code ci-dessous :
// wrapper de la classe native URLSessionDataTask
class WeatherURLSessionDataTaskFakeWrapper {
let weatherURLSessionDataTaskFakeWrapper: URLSessionDataTask
init(weatherURLSessionDataTaskFakeWrapper: URLSessionDataTask) {
self.weatherURLSessionDataTaskFakeWrapper = weatherURLSessionDataTaskFakeWrapper
}
}
// sous classe de mon wrapper
class WeatherURLSessionDataTaskFake: WeatherURLSessionDataTaskFakeWrapper {
var completionHandler: ((Data, URLResponse, Error) -> Void)?
var data: Data
var urlResponse: URLResponse
var responseError: Error
init( data: Data, urlResponse: URLResponse, responseError: Error) {
self.data = data
self.urlResponse = urlResponse
self.responseError = responseError
super.init(weatherURLSessionDataTaskFakeWrapper:
URLSessionDataTaskXXXXXXXXXXXXX)
}
func resume() {
completionHandler?(data, urlResponse, responseError)
}
func cancel() {
// not applicable
}
}
et c’est au niveau de URLSessionDataTaskXXXXXXXXXXXXX que je retrouve mon message :
Cannot convert value of type 'URLSessionDataTask.Type' to expected argument type 'URLSessionDataTask'
Je cherche depuis des heures et des heures (bon, je sais, je suis peut-être mauvais dans ce cas, je mérite davantage d’aide ) à trouver la meilleure forme de l’argument à renvoyer à la classe mère pour initialiser sa propriété de type URLSessionDataTask
Je rappelle qu’au niveau URLSession (voir le début) l’argument :
super.init(monParamètreWrapper: URLSession(configuration: .default))
a marché.
A vot’ bon coeur M’ssieux Dames.
Je reste à disposition avec plaisir.
Nouvelle étape :
--------------------------------------------------------------------------------------------------------
MARDI 15 NOVEMBRE 15H30 - EPILOGUE
-----------------------------------------------------------------------------------------------------------
Salut Bob,J’ai résolu (et compris) le dernier problème de comment trouver la meilleure forme du super.init à renvoyer à la classe mère
Du coup, j’ai pu cloner URLSession et URLSessionTask (et non pas créer des sous classes), ça m’a beaucoup appris aux travers des ressources. Toutefois, mon problème de tests unitaires n’est pas résolu, car le web service travaille avec les types URLSession et URLSessionTask et non avec des types clonés URLSessionFake et URLSessionTaskFake (… de Charybde en Scylla).
Mais j’arrête là et je jette l’éponge
Au départ, je voulais juste comprendre et traiter ce simple anodin warning :
'init()' was deprecated in iOS 13.0: Please use +[NSURLSession sessionWithConfiguration:] or other class methods to create instances
dans un code opérationnel basé sur de l’overriding de URLSession et URLSessionTask, et vers quoi Apple nous renvoyait, mais je n’ai pas réussi.
Bien à vous.