2013-10-28 5 views
11

AFNetworking 2.0을 사용하여 네트워크 요청을 수행하려고하는데 이상한 행동을합니다. AFHTTPSessionManagersuggested in the documentation으로 서브 클래스 화했으며, 기본 URL 세트가 있고 내 auth 헤더를 설정하는 싱글 톤 객체를 반환하는 클래스 메소드를 제공했습니다.AFHTTPSessionManager를 싱글 톤으로 사용하는 올바른 방법은 무엇입니까?

+ (id)sharedInstance { 
    static dispatch_once_t once; 
    static MyHTTPClient *sharedInstance; 

    dispatch_once(&once, ^{ 
    sharedInstance = [[self alloc] initWithBaseURL: NSURLURLWithString:kPlatformAPIBaseURL]]; 
    }); 

    //Uncommenting this line makes the error go away 
    //sharedInstance.responseSerializer = [AFJSONResponseSerializer serializer]; 

    //get latest session id everytime someone gets an instance of the client 
    sharedInstance.sessionId = [MySessionManager getSessionId]; 

    return sharedInstance; 
} 

- (instancetype)initWithBaseURL:(NSURL *)url { 
    self = [super initWithBaseURL:url]; 

    if(self) { 
    self.sessionId = [FSSessionManager getSessionId]; 

    self.serializer = [AFHTTPRequestSerializer serializer]; 
    [_serializer setValue:_sessionId forHTTPHeaderField:kAuthorizationHeader]; 
    [_serializer setValue:@"application/json" forHTTPHeaderField:kAcceptHeader]; 

    self.requestSerializer = _serializer; 
    } 

    return self; 
} 

- (void)setSessionId:(NSString *)sessionId { 
    _sessionId = sessionId; 
    [self.serializer setValue:_sessionId forHTTPHeaderField:kAuthorizationHeader]; 
} 

내 앱은 내 사용자를 인증하기 위해 POST 요청을하기 위해이를 사용합니다. 그건 잘된거야. 그런 다음 개체 목록을 검색하기 위해 GET 요청을합니다. 또한 위대한 작품. 그런 다음 동일한 GET 요청을 만들고 네트워크 오류가 발생했습니다. Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: application/json" 정확히 동일한 GET 요청이지만 두 번째 호출이 실패합니다. sharedInstance.responseSerializer 줄의 주석을 제거 할 때마다 공유 인스턴스에 대한 참조를 얻을 때마다 응답 serializer의 새 인스턴스를 만들면 더 이상이 오류가 발생하지 않습니다.

respondSerializer를 여러 번 안전하게 사용할 수 있습니까? 그것은 일종의 국가가 요청을 가로 질러 매달려있는 것처럼 느낍니다. 이것을 설정하는 올바른 방법은 무엇입니까?

+0

'responseSerializer '는 안전하게 여러 번 사용할 수 있습니다. POST (인증) 코드의 어디에서나'responseSerializer'를 변경하고 있습니까? –

+0

'self.serializer' 란 무엇입니까? 나는 AFHTTPSessionManager 또는 AFURLSessionManager 인터페이스에서이를 보지 못했습니다. –

+0

원래는 responseSerializer를 설정하지 않았습니다. 한 번 initWithBaseUrl 메서드에서 설정했지만 동일한 문제가있었습니다. 공유 인스턴스를 요청할 때마다 설정하는 경우에만 오류가 사라집니다. – ideaencoder

답변

7

응답 직렬화기를 여러 번 안전하게 사용할 수 있습니다. 게시 한 오류 메시지 ("용납 할 수없는 content-type : application/json")에 따라 responseSerializer이 코드의 다른 곳으로 설정되어있는 것 같습니다. JSON은 [AFJSONResponseSerializer serializer]으로 설정되어있는 한 올바르게 직렬화됩니다.

+0

이 답변으로 많은 시간을 절약 할 수있었습니다! 감사합니다 @ 애론! 내 경우에는 사진 메시지 목록을 다운로드하는 동안'responseSerializer'를 AFJSONResonseSerializer로 설정하고 각 사진을 다운로드 할 때'responseSerializer'가'AFImageResponseSerializer'로 설정되었습니다. 대답에 설명 된 이유 때문에 공유 클라이언트를 재사용하지 않았습니다. – indyfromoz

+1

@indyfromoz JSON이라면 JSON을, JSON이라면 JSON을 파싱하는 복합 시리얼 라이저를 만드는 것이 좋습니다. –

관련 문제