내 응용 프로그램에는 NSRURLSession을 만들고 NSURLRequest를 사용하여 보내는 기능이 있습니다.
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
이 작업의 완료 블록에서 UIView를 호출하는 뷰 컨트롤러에 추가하는 계산을 수행해야합니다. 나는 func라는 기능이 있습니다
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
UIImage-adding 계산을 수행합니다. 완료 블록 내에서 뷰 추가 코드를 실행하려고하면 Xcode에서 백그라운드 프로세스 중에 레이아웃 엔진을 사용할 수 없다는 오류가 발생합니다. 그래서 메인 스레드에서 메소드를 대기열에 넣는 SO 코드가 있습니다.
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))
dispatch_after(time, dispatch_get_main_queue(), {
let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})
그러나 매개 변수 “receiveAddr”및 “amountBTC”를이 함수 호출에 추가하는 방법을 모르겠습니다. 이 작업을 어떻게 수행하거나 누군가가 응용 프로그램의 기본 대기열에 메소드 호출을 추가하는 최적의 방법을 제안 할 수 있습니까?
답변
최신 버전의 Swift DispatchQueue.main.async
는 기본 스레드로 디스패치하는 데 사용 됩니다.
DispatchQueue.main.async {
// your code here
}
메인 큐에서 파견 하려면 다음 을 사용하십시오.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
이전 버전의 스위프트는 다음을 사용했습니다.
dispatch_async(dispatch_get_main_queue(), {
let delegateObj = UIApplication.sharedApplication().delegate as YourAppDelegateClass
delegateObj.addUIImage("yourstring")
})
답변
스위프트 3+ 및 스위프트 4 버전 :
DispatchQueue.main.async {
print("Hello")
}
스위프트 3 및 Xcode 9.2 :
dispatch_async_on_main_queue {
print("Hello")
}
답변
스위프트 2
후행 폐쇄를 사용하면 다음과 같이됩니다.
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
후행 폐쇄는 기능 매개 변수 범위 밖에서 폐쇄를 정의 할 수있는 스위프트 구문 설탕입니다. 자세한 내용은 Swift 2.2 프로그래밍 언어 안내서의 후행 폐쇄 를 참조하십시오 .
dispatch_async의 경우 API는 func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
이후 dispatch_block_t
에 대한 별칭입니다. () -> Void
-0 개의 매개 변수를 수신하고 리턴 값이없는 클로저이며 함수의 마지막 매개 변수 인 블록은 외부 범위에서 클로저를 정의 할 수 있습니다 dispatch_async
.
답변
메인 스레드에서 collectionView 다시로드
DispatchQueue.main.async {
self.collectionView.reloadData()
}
답변
다음은 다른 답변과 동일한 결과를 얻는 더 좋은 (IMO) Swifty / Cocoa 스타일 구문입니다.
NSOperationQueue.mainQueue().addOperationWithBlock({
// Your code here
})
또는 인기있는 Async Swift 라이브러리를 사용 하여 코드를 줄이고 기능을 향상시킬 수 있습니다.
Async.main {
// Your code here
}
답변
이를 수행하는 올바른 방법은 다음 코드에서와 같이 main_queue에서 dispatch_async를 사용하는 것입니다.
dispatch_async(dispatch_get_main_queue(), {
(self.delegate as TBGQRCodeViewController).displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
})
답변
보다 멋진 구문을 위해 추가 할 수있는 멋진 전역 함수가 있습니다.
func dispatch_on_main(block: dispatch_block_t) {
dispatch_async(dispatch_get_main_queue(), block)
}
그리고 사용법
dispatch_on_main {
// Do some UI stuff
}