2014-11-06 2 views
5

appDelegate에 내가 가진 아이폰 OS 응용 프로그램에서 일하고 있어요 func 응용 프로그램의 끝에서 true를 반환하기 전에 완료 될 때까지 기다리는 것을 좋아합니다.될 때까지 기다립니다 스위프트/IOS는

+2

스위프트에는 이러한 종류의 기능이 없습니다. 로드 그래픽을 사용하여'didFinishLaunching' 본문에 창 및 루트보기 컨트롤러를 설정 한 다음 API 로그인 완료 핸들러에서 새보기 컨트롤러로 이동해야합니다. –

+0

didFinishLaunching은 더 이상 사용되지 않지만 좋은 생각 인 것 같습니다. –

답변

11

참고 : 이 아니라이 스레드를 차단하므로이 방법으로 수행해야합니다. 더 좋은 방법은 위의 Nate의 의견을 참조하십시오.

GCD를 사용하여 비동기 호출이 완료 될 때까지 기다리는 방법이 있습니다. 코드는 다음과 같은

var semaphore = dispatch_semaphore_create(0) 

performSomeAsyncTask { 
    ... 
    dispatch_semaphore_signal(semaphore) 
} 

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
dispatch_release(semaphore) 

위키 백과 같을 것이다 것은 경우에 OK article 당신이 세마포어에 대해 아무것도 알 수 없습니다.

+0

위의 시도했습니다. dispatch_release (세마포어)가 Apple에 의해 삭제되었습니다. –

+2

그래서 dispatch_release (세마포어)를 제거했지만 semaphore_wait가 전체 스레드를 차단하는 것 같습니다. 실행이 비동기식 클로저에 멈추는 것처럼 보입니다. –

+1

학습의 정신에서 왜 내 의견이 나쁜 생각인지 설명해 주시겠습니까? –

1

이것은 Swift 3의 해결책입니다. 다시 비동기 작업이 완료 될 때까지 스레드를 차단하므로 특정 경우에만 고려해야합니다.

let semaphore = DispatchSemaphore(value: 0) 

performAsyncTask { 
    semaphore.signal() 
} 

// Thread will wait here until async task closure is complete 
semaphore.wait(timeout: DispatchTime.distantFuture) 
관련 문제