URLSession.shared.downloadTask
요청을 수행했지만 downloadTask
이 (가) 실행 된 동일한 스레드에서 코드를 실행하려고합니다. 예 :스레드 인스턴스에서 블록을 실행하는 방법은 무엇입니까?
func sample() {
let thread = Thread.current
URLSession.shared.downloadTask(with: file) {
someFunc() //How to execute on thread variable?
}.resume()
}
완료 핸들러는 백그라운드 스레드에서 실행됩니다. 그러나 sample()
이 (가) 호출 된 동일한 스레드에서 someFunc()
(으)로 전화하려고합니다. 나는 Thread.current.async {...}
같은 그래서 나는이 작업을 수행 할 수 있습니다 어떻게해야합니까 : 특정 Thread
에 뭔가를 실행하려면
func sample() {
let thread = Thread.current
URLSession.shared.downloadTask(with: file) {
thread.async { someFunc() } //Doesn't compile
}.resume()
}
이것은 문제를 해결할 수 있지만 스레드는 매우 낮고 복잡합니다. 'perform' :을 통해이 특정 쓰레드에 전달 될'sample' 메소드의 호출을 수정해야합니다. 'sample'과'someFunc' 사이에 다른 쓰레드에 의해 생성 된 out-of-order 이벤트를 처리해야 할 수도 있습니다 ... 같은 방법은 선호되는 방법 인 'OperationQueue'와 같은 고급 API를 사용하여 보관할 수 있습니다. – andih
나는 동의한다. 그래서 "할 수 있으면 GCD 사용"으로 마감했다. 하지만 이는 작업 대기열의 좋은 사용 사례는 아닙니다. 그리고 답을 할 때처럼 호출 스레드를 차단하는 것은 결코 좋은 생각이 아닙니다. – Rob
맞습니다. 차단 접근법은 피해야합니다. 차단을 피하는 또 다른 접근법은 종속적 인 작업을 사용하는 것입니다. – andih