Swift에서 GCD 메인 스레드에서 매개 변수가있는 메소드를 호출하는 방법은 무엇입니까?
내 응용 프로그램에는 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"를이 함수 호출에 추가하는 방법을 모르겠습니다. 이 작업을 어떻게 수행하거나 누군가가 응용 프로그램의 기본 대기열에 메소드 호출을 추가하는 최적의 방법을 제안 할 수 있습니까?
에 이것을 쓰십시오
completion handler
. 사용할 필요가 없습니다.
dispatch_after
dispatch_async(dispatch_get_main_queue(), {
let delegateObj = UIApplication.sharedApplication().delegate as YourAppDelegateClass
delegateObj.addUIImage("yourstring")
})
스위프트 3/4 :
DispatchQueue.main.async {
let delegateObj = UIApplication.sharedApplication().delegate as YourAppDelegateClass
delegateObj.addUIImage("yourstring")
}
메인 대기열 에서
발송 후 발송
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
YourAppDelegateClass
대의원으로 교체
스위프트 3 및 스위프트 4 버전 :
DispatchQueue.main.async {
print("Hello")
}
Swift3 및 XCode 9.2 :
dispatch_async_on_main_queue {
//Your code
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
.
다른 답변과 동일한 결과를 얻는 더 좋은 (IMO) Swifty / Cocoa 스타일 구문은 다음과 같습니다.
NSOperationQueue.mainQueue().addOperationWithBlock({
// Your code here
})
또는 인기있는
하여 코드를 줄이고 기능을 향상시킬 수 있습니다.
Async.main {
// Your code here
}
메인 스레드에서 collectionView 다시로드
DispatchQueue.main.async {
self.collectionView.reloadData()
}
이를 수행하는 올바른 방법은 다음 코드에서와 같이 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
}
클로저 내부에서 자체를 사용하는 경우 자신을 약화시키는 것을 잊지 마십시오.
dispatch_async(dispatch_get_main_queue(),{ [weak self] () -> () in
if let strongSelf = self {
self?.doSomething()
}
})
//Perform some task and update UI immediately.
DispatchQueue.global(qos: .userInitiated).async {
// Call your function here
DispatchQueue.main.async {
// Update UI
self.tableView.reloadData()
}
}
//To call or execute function after some time
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
//Here call your function
}
//If you want to do changes in UI use this
DispatchQueue.main.async(execute: {
//Update UI
self.tableView.reloadData()
})
참고 :
'programing' 카테고리의 다른 글
UIlabel layer.cornerRadius가 iOS 7.1에서 작동하지 않습니다 (0) | 2020.05.18 |
---|---|
최대 절전 모드 예외 : org.hibernate.AnnotationException : 엔티티에 지정된 식별자가 없습니다 : com..domain.idea.MAE_MFEView (0) | 2020.05.18 |
치명적 : 자식 쓰기 트리 : 오류 트리 작성 (0) | 2020.05.18 |
.NET에서 파일 규칙 당 하나의 클래스? (0) | 2020.05.18 |
Java에서 sha256으로 문자열을 해시하는 방법은 무엇입니까? (0) | 2020.05.18 |