2015-02-05 4 views
0

코드가 다음 함수로 실행되기 전에 클로저가 함수 체인에서 끝날 때까지 기다릴 수 있는지 궁금합니다.SWIFT의 함수 체이닝 도중에 클로저가 완료 될 때까지 기다리십시오.

예를 들어

:

SomeSingletonClass.sharedInstance.bFunction() 

을 그리고는 sharedInstance의 첫 번째 호출이 있다면, 나는()() SingletonClass의 종료 초기화에 폐쇄 * 때까지 기다려야 bFunction을하고 싶습니다. 어떻게 든 UI를 차단하지 않고도 가능합니까?

*이 폐쇄는 액세스 권한 부여 알림을 표시 할 수 있으며 bFunction()은 사용자의 반응을 기다려야합니다 (사용자의 답변에 따라 bFunction을 전혀 호출하지 않을 수도 있음).

어떤 조언을 주셔서 감사합니다. GoZoner가 제안

업데이트

는 그래서, dispatch_semaphore_create()/signal()/wait()으로 init() 방법에서의 실행을 차단했지만,이 경우 애플리케이션을 차단하고 AlertView를 표시 할 수 없다.

답변

1

SomeSingletonClass에 대한 init() 방법은 '액세스 권한 부여 허용'이 완료 될 때까지 해당 실행을 차단해야합니다. 완료되면 init() 메서드가 다시 시작되고 sharedInstance 속성이 반환되고 bFunction() 메서드가 반환 된 인스턴스에 적용됩니다.

실행을 차단하는 데는 여러 가지 방법이 있습니다. 사용하는 것은 애플리케이션의 다중 처리 세부 사항에 달려 있습니다.

+0

와 백그라운드 스레드에 알림을 보낼 수 있을까? 좋은 생각입니까? 팝업을 표시하면서 (이전에 시작된) 일부 네트워크 요청이있을 수 있습니다. 실행을 차단하면 이러한 요청에 영향을 미칩니 까 (예 : Request Timeout이 발생할 수 있음)? 또는 다른 스레드에서 전체 코드 줄을 실행해야합니까? – danieltmbr

+0

표시된 것처럼'bFunction()'을 호출해야한다면'init()'이 호출 된 모든 스레드를 차단해야합니다. 다른 옵션은 'Alert'(또는 다른 UI 작업)에서 콜백을 사용하는 것입니다. – GoZoner

0

당신은 당신의 코드

SomeSingletonClass.sharedInstance.bFunction() 

주 스레드가 아닌 다른 스레드에서 살 수있을 것으로 생각 해 봤나?

그런 식으로 sharedInstance 함수 (SomeSingletonClass을 초기화 함)는 초기화 된 값을 비동기 적으로 비동기 적으로 생성 할 수 있으며, 완료되면 세마포어를 기다릴 수 있습니까?

그런 식으로 기본 스레드를 차단하지 않습니다.

당신은 폐쇄에서 NSNotificationCenter.defaultCenter().postNotificationName("weirdKeyName", object: nil)

NSNotification를 게시하고 통지가 도착하는대로 폐쇄 코드를 즉시 실행되었을 때 할 필요가 무엇이든 혹은 그 이상의 경고를 그 통지를 듣고 부를 수

1

: NSNotificationCenter.defaultCenter().addObserver(self, selector: "alertFunction", name: "weirdKeyName, object: nil)

alertFunction() { 
    ... 
} 

알림을 트리거하기 위해 NSNotification을 기다리지 않아도 응용 프로그램이 차단되고 종료가 완료 될 때까지 기다리지 않아도됩니다. 당신이 그렇게 원하는 경우

또한, 당신은 내가 단지 메인 스레드를 차단한다, 그래서 NSNotificationQueue

관련 문제