2017-03-07 3 views
1

의 특정 스레드에서 코드를 실행 :내가이 같은 기능을 가지고 스위프트

func foobar() { 
    let targetThread = Thread.current 

    DispatchQueue.main.async { 
    UIView.animate(withDuration: 0.5, animations: { 
     // Code I need to run on the main thread 
    }, completion: { 
     // Code I want to run on targetThread -- HOW? 
    } 
    } 
} 

어떻게 targetThread에서 코드를 실행합니까? 감사.

+0

현재 실행중인 스레드를 사용하는 대신 새 스레드를 만드는 것이 좋습니다. 메서드 외부에 대한 액세스를 유지하고이 메서드를 호출 할 때 메서드를 시작합니다. class var current : Thread 현재 실행 스레드를 나타내는 스레드 객체를 반환합니다. – Deepak

+0

왜 특정 스레드에서 코드를 실행해야합니까? 당신은 그렇게해서는 안되며 이것은 낙담합니다. 완료 블록에서'DispatchQueue.global(). async'를 원하고 그곳에서 코드를 실행하고 싶지만 목표 스레드에서 코드가 실행되는 이유를 알려주십시오. – Alistra

+1

대리자를 호출 한 동일한 스레드에서 대리자를 호출하는 것이 일반적입니다. 불행히도 gcd는 실제로 그것을 지원하지 않습니다. NSObject의 performSelector : onThread는 사용할 수 있지만 매우 깨끗한 API는 아닙니다. performEelector : onThread를 사용하는 performBlock : onThread 메서드가 프로그램에있는 것을 보았습니다. – EricS

답변

1

DispatchQueue는 (는) 스레드가 아닙니다. 현재 DispatchQueue 현재 스레드를 얻을 수있는 방법을 얻을 수있는 방법이 없다는 것을 알 수 있습니다. 방금 메인 스레드 아닌 어딘가에 코드를 실행하려면, 당신은 사용할 수 있습니다 : 당신이 정말로 특정 스레드를 대상으로 지정할 경우

DispatchQueue.global().async { ... }

, 당신은 두 가지 선택이있다.

첫 번째는 당신이 사용할 수있다 NSObjectperform(_:on:with:waitUntilDone:) (또는 관련 방법 중 하나)과 NSThread 당신이 왔를 전달합니다. 귀하의 질문에이 문맥이 당신에게 효과가 있는지, 예를 들어 줄 수 있는지에 대해 충분한 문맥이 없지만 검색 할 수는 있습니다.

두 번째

는 다른 NSOperation를 예약 할 것, NSOperationQueue, 그래서 foobar() 애니메이션에 대한 완성 후 NSOperationQueue에 대한 작업에서 실행됩니다 사용하는이 모든 시작 코드를 다시 작업하는 것입니다 동일한 작업 대기열에서 실행됩니다. 또한 디스패치 대기열을 직접 사용하여이 작업을 수행 할 수 있습니다. 즉, 자체 디스패치 대기열을 만들고, foobar를 전달한 다음 애니메이션이 완료되면 main에서 대기열로 다시 전달합니다.

관련 문제