2016-11-18 2 views
1

Lors de l'analyse d'un fichier XML à partir d'un serveur, je l'ai toujours utilisé "init(data: Data)"NSXMLParser contentsOfURL Vs données

let url = URL(string: urlString) 
let data = NSData(contentsOf: url!) 
let parser = XMLParser(data: data as! Data) 

J'ai lu la documentation et de voir cette méthode "init?(contentsOf: URL)"

let url = URL(string: urlString) 
let parser = XMLParser(contentsOf: url!) 

Question est alors Suis-je en train de convertir inutilement un objet de données à partir du contenu de l'URL, et je peux tout aussi bien initialiser à partir de l'URL? Ou, y a-t-il un quelconque mérite à créer l'objet de données et à l'analyser à partir de cela?

Répondre

2

Il n'y a pas de différence sémantique entre les deux variantes.

Pour http (s) urls vous devriez préférer init(data:) ou XMLParser(data:), mais vous ne devriez pas vous charger des données avec NSData(contentsOf:). La raison en est que les variantes contentsOf: bloquent le thread en cours avec une requête synchrone. Vous devez plutôt charger les données de manière asynchrone avec NSURLSession.

Vous devez utiliser XMLParser(contentsOf:) et Data(contentsOf:) seulement pour fichier urls.

+0

Merci pour l'explication. J'appelle l'ensemble de la fonction sur un thread d'arrière-plan afin de ne pas bloquer le thread actuel de toute façon. – RyanTCB

+1

Non, vous bloquez le thread d'arrière-plan. Un thread d'arrière-plan peut aussi être votre thread_current. Ce n'est pas une bonne solution. L'utilisation de requêtes NSURLSession et asynchrones n'est pas très difficile. Les requêtes asynchrones sont exécutées par la boucle de lancement et elles ne bloqueront aucun thread. – clemens

+0

Oh ouah merci. Je vais utiliser NSURLSession alors. – RyanTCB