Правильный способ использования AFHTTPSessionManager в качестве одноэлементного?

Я пытаюсь использовать AFNetworking 2.0 для выполнения своих сетевых запросов, но я сталкиваюсь с каким-то странным поведением. Я подклассифицировал AFHTTPSessionManager как предложенный в документации, и предоставил метод класса, который возвращает объект singleton, который имеет базовый url, а также устанавливает мой заголовок auth.

+ (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, поэтому я создаю новый экземпляр сериализатора ответа каждый раз, когда получаю ссылку на мой общий экземпляр, тогда я больше не получаю эту ошибку.

Невозможно ли использовать многократный ответ responseSerializer? Похоже, какое-то государство висит вокруг запросов. Какой правильный способ настроить это?

Ответ 1

Сериализатор ответов может использоваться несколько раз безопасно. На основании сообщения об ошибке, которое вы опубликовали, "неприемлемый тип контента: application/json", похоже, вы устанавливаете responseSerializer в другое место в вашем коде. JSON будет сериализоваться правильно, если он установлен на [AFJSONResponseSerializer serializer].