2011-07-26 2 views
0

저는 지금 애플 리케이션 로그인이 필요한 제 아이폰 앱에 몇 가지 페이스 북 기능을 구현하고 있습니다. 로그인 자체는 더 이상 문제가되지 않습니다.비동기 이벤트에 어떻게 대응할 수 있습니까 (로그인)?

하지만 페이스 북 SDK가 이벤트와 함께 작동한다는 사실 때문에 성공적인 로그인에 대한 대응으로 내 행동을 수행하는 방법을 알지 못합니다. 예를 들어

:

나는 방법이 방법은 동작이 실제로 수행 할 수 있는지 확인하기 위해 로그인 방법을 호출해야

- (void)refreshEvents; 

에게 있습니다. 그래서 나는 [self checkLogin]라고 부른다. 그러나 지금 무엇? 내 방법에 실제로 묶이지 않은 이벤트를 어떻게 기다릴 수 있습니까? checkLogin은 비동기 작업/이벤트를 트리거하므로 로그인이 수행 될 때까지 기다리지 않도록 할 수는 없습니다.

- (void)request:(FBRequest *)request didLoad:(id)result; 

결과 액세스 토큰을 처리하는 동안 방법에

는 어떻게 초기 행동이었다 무엇을 말할 수있는, 그래서 계속 할 수 있습니까?

제 아이디어는 "로그인 후 수행 할 작업"대기열을 보유하고있는 배열에 인스턴스 변수를 사용하는 것이지만, 이는 실제로 불쾌한 해결 방법 인 것 같습니다. 당신의 도움에 대한

감사

아르네

답변

1

가장 간단한 해결 방법은 로그인이 완료되면 실행될 수있는 완료 블록을 통과하는 것입니다. 또한 오류가있는 경우 호출되는 블록을 전달할 수 있습니다. 내 응용 프로그램에서는 이것을 완성 및 오류 블록이 포함 된 클래스를 정의하는 '응답자'패턴으로 래핑했습니다. 이는 비동기 메서드에 대한 인수로 전달됩니다. 여기서 유일한 포착은 적절한 시간에 블록을 '실행'하기 위해 로그인을 작성해야한다는 것입니다.

비동기 API (Facebook SDK 포함)를 사용하는 응용 프로그램에서이 패턴을 여러 번 구현했습니다. (일부 코드 샘플 추가)

업데이트 :

가장 간단한 형태에서

, 당신은 단지 완료 블록을 추가 할 수 있습니다. 먼저 완료 블록에 대한 typedef를 작성하려고합니다. 이 경우, 우리는 어떤 값도 반환하지 않는다 및 ID 입력이있는 블록을 사용합니다 :

typedef void (^successBlock)(id); 

다음, 당신은 페이스 북의 클래스와의 상호 작용에 대한 외관을 생성하는 컨트롤러를 만들 수 있습니다. 이 외관에서이 같은 서명 (이 가정은 형 successBlock의 바르가)가 로그인 방법을 만들 수 있습니다 귀하의 FBSessionDelegate 구현에

- (void)loginWithCompletionHandler:(successBlock)handler 
{ 
    // If you aren't using ARC - you'll need to use Block_copy(handler) 
    completionHandler = handler; 

    [facebook authorize:facebookSettings.defaultPermissions 
       delegate:self]; 
} 

마지막을,이 블록을 실행할 수 있습니다

#pragma mark - FBSessionDelegate Implementation 

- (void)fbDidLogin 
{ 
    // Store Facebook token, etc..... 

    if(completionHandler) 
    { 
     // You could pass any data you want in this data property 
     completionHandler(data); 
    } 
} 

}

내가 위에서 언급 한 '응답자'패턴은 조금 더 복잡 이것보다, 그러나 이것은 당신이 가야하기에 충분합니다.

+0

안녕하세요. 빠른 답변을 보내 주셔서 감사합니다. 나는 그 패턴에 대해 잘 알고 있지 않습니다. 로그인과 혼합하는 방법에 대한 구체적인 예가 있습니까? – arnekolja

+0

위 코드를 추가했습니다. 이것이 올바른 방향으로 가리키고 있는지 알려주세요. – dtuckernet

+0

completionHandler를 지울 때/어떻게해야합니까? 그것을 호출 한 후 nil로 설정하면됩니까? –

관련 문제