2

다음 메소드를 사용하여 10 초 이내에 OAuth 액세스 토큰을 동기식으로 얻으려고합니다. 그렇지 않으면 nil을 반환합니다. 그것은 잘 작동하지만 연습으로 세마포어를 사용하도록 코드를 변환하고 싶습니다.observer를 사용하여 세마포어에 신호를 보내시겠습니까?

Runloop 버전

- (NSString*)oAuthAccessToken 
{ 
    @synchronized (self) 
    { 
     NSString* token = nil; 
     _authenticationError = nil; 
     if (_authentication.accessToken) 
     { 
      token = [NSString stringWithFormat:@"Bearer %@", _authentication.accessToken]; 
     } 
     else 
     { 
      [GTMOAuth2ViewControllerTouch authorizeFromKeychainForName:_keychainName authentication:_authentication]; 
      [_authentication authorizeRequest:nil delegate:self didFinishSelector:@selector(authentication:request:finishedWithError:)]; 
      for (int i = 0; i < 5; i++) 
      { 
       [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; 
       if (_authentication.accessToken) 
       { 
        token = [NSString stringWithFormat:@"Bearer %@", _authentication.accessToken]; 
        break; 
       } 
       else if (_authenticationError) 
       { 
        break; 
       } 
      } 
     } 
//  LogDebug(@"Returning token: %@", token); 
     return token; 
    } 
} 

세마포어 버전

코드의 세마포어 버전이가는이 같은 작은 선물 :

- (NSString*)oAuthAccessToken 
{ 
    @synchronized (self) 
    { 
     NSString* token = nil; 
     _authenticationError = nil; 
     if (_authentication.accessToken) 
     { 
      token = [NSString stringWithFormat:@"Bearer %@", _authentication.accessToken]; 
     } 
     else 
     { 
      _authorizationSemaphore = dispatch_semaphore_create(0); 
      dispatch_async(_authorizationRequestQueue, ^(void) 
      { 
       [GTMOAuth2ViewControllerTouch authorizeFromKeychainForName:_keychainName authentication:_authentication]; 
       [_authentication authorizeRequest:nil delegate:self didFinishSelector:@selector(authentication:request:finishedWithError:)]; 
      }); 
      dispatch_semaphore_wait(_authorizationSemaphore, DISPATCH_TIME_FOREVER); 
      if (_authentication.accessToken) 
      { 
       token = [NSString stringWithFormat:@"Bearer %@", _authentication.accessToken]; 
      } 
     } 
     return token; 
    } 
} 

잡았다! GTMOAuth2가 다시 위임 방법을 통해 호출하는 네트워크를 공격해야하는 경우 GTMOAuth2 때때로 즉시

  • 반환합니다. 이 방법에서는 세마포 신호를 보냅니다.
  • 때때로 GTMOAuth2가 즉시 반환 할 수 있습니다. 문제는 메소드가 void를 반환한다는 것입니다.

후자의 경우 어떻게하면 내 세마포어에 신호를 보낼 수 있습니까? 인증 기관에 관찰자를 추가하면 토큰이 발사됩니까?

+1

ReactiveCocoa! KVO 등을위한 놀라운 라이브러리입니다. 신호는 그런 경우에 당신의 친구입니다. – allprog

+0

고마워요. 시험해 볼게요 !! . . Btw, 그렇습니다. 관찰자는 잘 작동합니다. –

답변

3

저는 GTMOAuth2 라이브러리에 익숙하지 않지만 authentication.accessToken은 속성이므로 KVO를 준수하지 못하는 것 같지 않습니다. 옵서버를 추가하면 비동기와 동기화 모두를 위해 모든 경우에서 효과가 있습니다. 따라서 비동기 경우 만 고려할 것입니다.

솔루션을 더욱 깨끗하게 만들고 싶다면 Reactive Cocoa을 꼭 시도해야합니다.

+1

네, 정상적으로 작동합니다. 나는 내가 게시 할 때까지 내 문제를 해결하는 가장 좋은 방법이라고 생각하지만이 정보는 다른 사람들에게 유용 할 수 있으므로 여기에 모두 남겨 두십시오. . 나는 두 가지를 스스로 배웠다 : a) 관찰자는 동기화와 비동기 모두를 위해 일해야한다. b) 반응 코코아 체크 아웃 –

+1

@JasperBlues 확실히 타이푼을 사용해보아야 할 것이다. 나는 얼마 전에 그것을보고 있었지만 이제는 배포 준비가 끝났으므로 완전히 시도하고 싶습니다. – allprog

+0

귀하의 의견은 우리에게 정말 귀중한 것입니다 :) –