Каковы альтернативы NSURLConnection для кускового кодирования передачи - PullRequest
10 голосов
/ 15 февраля 2012

Я проверил другие вопросы, относящиеся к этому, но единственный ответ - «Использовать ASIHTTPRequest», так как он больше не разрабатывается. Я хотел спросить, какие альтернативы используют люди, работая над нашим SDK, с которым я столкнулсямного странного поведения в NSURLConnection при получении данных с сервера.

Мы отследили это до того факта, что NSURLConnection плохо справляется с ответами в чанкованном кодировании.Или, по крайней мере, так мы читаем в этом вопросе здесь NSURLConnection и "chunked" Transfer-Coding

Некоторые разработчики, о которых мы говорили, говорят, что в iOS 5 все становится лучше, мы должны убедиться, чтонаш SDK обратно совместим с iOS 4.3 по крайней мере.

Я хочу подтвердить, что это действительно проблема в NSURLConnection, и как люди с ней справляются.

Все альтернативы, которые я 'мы обнаружили, что основаны на NSURLConnection, и я предполагаю, что как таковой будет иметь тот же недостаток.ASIHTTPRequest на самом деле работал, потому что он базировался немного ниже, чем NSURLConnection, но искал альтернативы в знаниях, которые больше не поддерживаются.

Список других библиотек, на которые смотрели: Restkit,ShareKit, LRResty, AFNetworking, TTURLRequest

Я знаю, что здесь есть похожие вопросы Является ли RESTKit хорошей заменой для ASIHTTPRequest? и здесь ASIHTTPRequestальтернатива Но оба решения основаны на NSURLConnection.

РЕДАКТИРОВАТЬ: я заметил, что указал на неправильный вопрос в начале моего сообщения, так что это обновлено.Это указывает на ветку с 2008 года, и я видел похожие, но не последние.

Ответы [ 3 ]

19 голосов
/ 28 февраля 2012

Частичные переводы поддерживаются NSURLConnection. Я использую их.

  1. Определите некоторые реквизиты:

    NSMutableData * responseData;
    NSURLConnection * connection;
    
  2. Установить соединение

    NSURL *url = [NSURL URLWithString:@"...."];
    self.responseData = [[NSMutableData alloc] initWithLength:0] ;
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    
  3. Зарегистрируйте свой метод обратного вызова для установленного соединения

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
         // You may have received an HTTP 200 here, or not...
         [responseData setLength:0];
    }
    
  4. Зарегистрируйте свой метод обратного вызова для "чанка получена"

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
        NSString* aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    
        NSLog(@"This is my first chunk %@", aStr);
    
    }
    
  5. Зарегистрируйте обратный вызов «соединение завершено»:

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
       [connection release];
    }
    
  6. И, наконец, зарегистрируйте обратный вызов «сбой соединения»:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Something went wrong...");
}
9 голосов
/ 12 июня 2014

Просто чтобы присоединиться к следующему человеку, который попал сюда и все еще не может заставить NSURLConnection работать с данными, закодированными в чанках.

NSURLConnection будет работать с кодированием по частям, но имеет нераскрытое внутреннее поведение, так чтоон будет буферизовать первые 512 байт, прежде чем откроет соединение, и пропустит что-либо через IF Content-Type в заголовке ответа «text / html» или «application / octet-stream».Это относится как минимум к iOS7.

Однако он не буферизует ответ, если для Content-Type установлено значение "text / json".Таким образом, тот, кто не может получить ответы NSURLConnection с чанкованным кодированием на работу (т.е. обратные вызовы не вызываются) должен проверить заголовок ответа и изменить его на сервере на «text / json», если он не нарушает поведение приложения каким-либо другим способом..

2 голосов
/ 15 февраля 2012

Нет альтернатив, о которых я знаю.

Все остальные библиотеки построены поверх NSURLConnection. Хотя вы можете использовать одну из не-iOS библиотек, например. Libcurl.

ASIHTTPRequest - единственная библиотека, о которой я знаю, которая вместо этого построена поверх уровня CFNetworking. Это было (возможно косвенно) основной причиной, по которой первоначальный разработчик прекратил работу над ним - потому что он не использует NSURLConnection, у него есть много кода.

Возможно, не совсем правильно говорить, что ASIHTTPRequest больше не поддерживается. Это правда, что первоначальный разработчик больше не работает над ним, но если вы посмотрите на коммиты github, то увидите, что над ними все еще работают другие люди. Многие люди до сих пор используют его по разным причинам, включая меня самого.

Сказав все это, вернемся к проблеме, которая у вас есть: я не уверен, что 3-летняя нить обязательно является окончательной ссылкой, чтобы доказать, что 1-летняя версия (т.е. iOS 4.3) NSURLConnection не ' Поддерживает чанкованные переводы. Чанкованные переводы используются в Интернете настолько часто, что кажется маловероятным, чтобы у них была такая большая и очевидная проблема. Возможно, что на сервере, который вы используете, есть что-то особенное, что вызывает проблему.

...