두 개의 완료 블록이 완료된 경우에만 실행하고 싶은 기능이 있습니다 (그리고 어느 것이 먼저 완료해야하는지 알 수 없음). 아래는 작동하는 내 시도입니다. 그러나 그것은 매우 지저분하고 내가 기다리고 싶은 완료 블록이 세 개 이상 있으면 모든 곳에 플래그가 있습니다. 더 예쁜 방법이 있는지 궁금합니다.
class TestClass: UIViewController {
var blockOneComplete = false
var blockTwoComplete = false
func blockOneDownloadImageDescription(completion:()->Void) {
downloadAsyncWithCompletion {
blockOneComplete = true
if self.blockTwoComplete == true {
self.allDataDownloadCompleted()
} else {
// Do nothing and wait for block Two to complete
}
}
}
func blockTwoDownloadImageData(completion:()->Void) {
downloadAsyncWithCompletion {
blockTwoComplete = true
if self.blockOneComplete == true {
self.allDataDownloadCompleted()
} else {
// Do nothing and wait for block One to complete
}
}
}
func allDataDownloadComplete() {
// Execute this funciton after all Async Download has complete
}
}
-최종 결과로 업데이트-이 웹 사이트에 설명 된 내용이 정확히 내가 필요로하는 것이 밝혀졌습니다. 디스패치 그룹을 사용하여 여러 웹 서비스를 기다립니다.
최종 솔루션에는 dispatch_group_enter 및 dispatch_group_leave가 포함되어 있기 때문에 이것이 주석에 언급 된 SO 질문의 중복이 아니라고 생각합니다.
플래그를 관리하지 않으려면이를 달성하기 위해 dispatch_group
기능적 반응 프로그래밍 라이브러리 를 사용 하거나 사용해야합니다 RxSwift
.
그러나 하나의 카운터 플래그를 사용하고 함수를 호출하거나 NSNotification
if is for another를 사용할 수 ViewController
있습니다.
내 프로젝트 중 하나에서 completion block
일부 함수를 호출하기 전에 4 개 중 3 개 이상 이 완료 되었는지 확인해야 합니다. 나는 다음과 같이 그것을한다.
class TestClass: UIViewController {
var numberOfBlockCompleted = 0
func blockOneDownloadImageDescription(completion:()->Void) {
downloadAsyncWithCompletion {
numberOfBlockCompleted += 1
self.allDataDownloadCompleted()
}
}
func blockTwoDownloadImageData(completion:()->Void) {
downloadAsyncWithCompletion {
numberOfBlockCompleted += 1
self.allDataDownloadCompleted()
}
}
func blockThreeDownloadImageDesc(completion:()->Void) {
downloadAsyncWithCompletion {
numberOfBlockCompleted += 1
self.allDataDownloadCompleted()
}
}
func allDataDownloadComplete() {
if numberOfBlockCompleted == 3 {
//do something
}
}
}
제 생각에는 앱이 얼마나 복잡한 지에 따라 크게 달라집니다. 한두 부분 만 있으면 플래그로 충분합니다. 그러나 앱이 주로 네트워크 호출을 연결하고 라이브 주식 앱처럼 완료 될 때까지 기다려야하는 다른 서버에서 가져 오는 데 의존하는 경우 GCD에 대한 강력한 지식이나 기능적 반응 프로그래밍을 사용하면 작업이 더 쉬워집니다. 장기적으로.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다