2013-10-19 3 views
0

서버에 대한 두 개의 비동기 호출이 있습니다. Call A는 사용자를 인증하고 세션 토큰을 반환합니다. 호출 B는 서버에서 데이터를 가져옵니다. 호출 B는 호출 A의 세션 토큰이 필요하므로 서버는 요청을 승인하고 데이터를 리턴합니다.비동기 호출로 자동 다시 로그인

10 분 후에 세션 토큰이 만료되고 서버가 B를 호출하기 위해 데이터를 반환하지 않습니다.이 시나리오에서는 재 인증을 위해 전화 A를 다시하고 통화에 사용할 수있는 새 유효한 세션 토큰을 얻어야합니다 B.

내가 직면 한 문제는 내가 이것을 자동화하고 깨끗한 디자인으로 구현하는 방법을 모른다는 것입니다. B 호출이 "세션이 만료되었습니다."라는 메시지가 서버에서 수신되면 비동기 호출 A가 시작되고 A 호출에서 제공된 새 세션 토큰으로 자체가 다시 시작되는 방식으로 구현하고 싶습니다. Objective-C 및 iOS 프레임 워크에서 제공하는 도구는 무엇입니까?

+0

아무 것도 설명되어 있지 않습니다. 재 인증의 필요성을 감지하려면 상태 플래그 (예 : BOOL이 만기 됨)가 필요할 것입니다. 아마도 플래그 테스트와 함께 하나의 재귀 메시지를 사용했을 것입니다. –

+0

[URL 로딩 시스템 프로그래밍 가이드] (https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html#//apple_ref/doc/uid/10000165- BCICJDHA), 특히 "쿠키 저장"장 및 인증에 대한 모든 장을 참조하십시오. 액션 과정은 밑의 네트워크 요청에 대해 NSURLSession, NSURLConnection 또는 NSURLDownload 객체를 사용하는지 여부에 따라 달라지며 세션 토큰이 처리되는 방법에 따라 다릅니다. 이를 쿠키로 처리하면 기존 코드를 많이 추가 할 필요가 없을 것입니다. – CouchDeveloper

답변

1

AFNetworking과 같은 것을 사용하는 경우 두 작업을 수행하는 방법을 알고있는 AFHttpClient의 하위 클래스를 만듭니다. callB 구현에서 서버에서 유효하지 않은 세션 응답을 얻었는지 확인한 다음 수동으로 callA를 호출 한 다음 완료된 callB를 다시 호출하십시오.

수동으로 재 인증 한 후에 callB을 호출하는 경우 매개 변수를 callB으로 캡처하는 것이 좋습니다. 데이터가 몇 개인 경우 로컬 변수가 정상적으로 작동합니다. 문제가 발생하면 런타임과 record the NSInvocation이 처음 인 callB으로 까다로워 질 수 있으며 나중에 다시 실행합니다. 기본적으로 사용자의 callB 메소드는 세션이 유효한지 확인하기 위해 swizzled/proxied됩니다.

+0

AFNetworking을 기반으로하는 RestKit을 사용하고 있으며 이미 callA와 callB를 구현했습니다. 세션이 만료 된 경우 탐지 코드가 포함됩니다. callB가 세션이 만료 된 것을 감지하면 callA가있는 메소드를 호출 할 수 있습니다. 하지만 내 문제는 어떻게 세션 호출 후 호출 된 모든 매개 변수를 포함한 모든 매개 변수를 호출 한 후 "재실행"을 호출하는 것입니다. 당신은 "completion delegate"에 대해 글을 쓴다. 무슨 뜻인지 자세히 설명해 주시겠습니까? 제 오해가 있다고 생각합니다. –

+0

메시지 캡처에 대한 세부 정보를 포함하도록 답변이 업데이트되었습니다. – RyanR

+0

감사합니다. RyanR. 나는 NSInvocation을 몰랐지만이 솔루션은 매우 유망한 것으로 보인다. 내가 아는 한, 메서드 호출을 저장하여 B를 모든 인수와 함께 NSInvocation 개체에 저장하고 callA에 전달할 수 있습니다. callA는 성공적인 재 인증 후에 NSInvocation을 호출 할 수 있으며, callB는 아무 일도 일어나지 않았던 것처럼 재방송을받을 것입니까? –