2017-09-06 11 views
0

objective C에 아래의 코드를 사용하여 세마포어로 작업하고 있습니다.신속한 dispatch_semaphore_t 3

-(void)doSome{ 
    semaphore = dispatch_semaphore_create(0); 

    BaseViewController *baseVC = [[BaseViewController alloc]init]; 
    if(baseVC.isUserObjectExist){ 
     [self callLoginWebService:baseVC.userObject.username passwordString:baseVC.userObject.password]; 
    }else{ 
     dispatch_semaphore_signal(semaphore); 
    } 

    while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW)) { //2 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100]]; 
    } 

} 

그러나

'dispatch_semaphore_t은'빠른 3 세마포어를 통합하는 방법

스위프트

에서 사용할 수 없습니다?

+0

** ** 같은 비동기 메서드 호출을 위해 세마포어를 사용하지 마십시오. 완료 핸들러를 사용하십시오. – vadian

+0

@vadian, 스플래시 화면에서 비동기 메서드를 호출하고 싶습니다. 더 좋은 방법은 무엇입니까. 완성 처리기를 사용하여 어떻게 달성 할 수 있습니까? 안내해주십시오. – pkc456

답변

2

당신은 만들 수 있습니다에 의해

let semaphore = DispatchSemaphore(value: 0) 

Learn official document of Apple

또는 다른 코드에서

let url = URL(string: "") 
     let semaphore = DispatchSemaphore(value: 0) // 1 
     let _ = DownloadPhoto(url: url!) { 
      _, error in 
      if let error = error { 
      } 
      semaphore.signal() // 2 
     } 
     let timeout = DispatchTime.now() + .seconds(5) 
     if semaphore.wait(timeout: timeout) == .timedOut { // 3 
     } 
+0

'value'를 0으로 전달했습니다. 그 의미는 무엇입니까? – pkc456

+0

2. 제 경우에는'DownloadPhoto'의 콜백이 메인 큐에 있습니다. 따라서 세마포어는 절대로 신호를받지 못합니다. 메인 큐를 사용하는 세마포어로 작업하는 법. – pkc456