2016-11-18 9 views
1

난 항상 "init(data: Data)는"NSXMLParser contentsOfURL 대 데이터

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

내가 문서를 읽고 "init?(contentsOf: URL)는"

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

질문은 다음이 방법을 참조 사용한 서버에서 XML 파일을 구문 분석 불필요하게 URL 내용에서 데이터 객체로 변환하고 있으며 URL에서 초기화 할 수 있습니까? 아니면 데이터 객체를 만들고 그로부터 파싱 할 때 어떤 이점이 있습니까?

답변

2

두 변종 간에는 의미상의 차이가 없습니다. HTTP (S) URL에 대한

당신은 init(data:) 또는 XMLParser(data:)을 선호한다, 그러나 당신은 NSData(contentsOf:) 당신에게 데이터를로드하지 않아야합니다. 그 이유는 contentsOf: 변형이 동기 요청으로 현재 스레드를 차단하기 때문입니다. 대신 NSURLSession과 비동기 적으로 데이터를로드해야합니다.

XMLParser(contentsOf:)Data(contentsOf:) URL에만 사용해야합니다.

+0

설명해 주셔서 감사합니다. 백그라운드 스레드에서 전체 함수를 호출하므로 어쨌든 현재 스레드를 차단하지 않습니다. – RyanTCB

+1

아니요, 백그라운드 스레드를 차단하고 있습니다. 백그라운드 스레드가 _current 스레드 _ 일 수도 있습니다. 이것은 좋은 해결책이 아닙니다. NSURLSession과 비동기 요청을 사용하는 것은 그리 어렵지 않습니다. 비동기 요청은 runloop에 의해 실행되며 스레드를 차단하지 않습니다. – clemens

+0

오 와우 감사합니다. NSURLSession을 사용합니다. – RyanTCB