对于分块传输编码,NSURLConnection是什么select

我已经检查了与此相关的其他问题,但唯一的答案是“使用ASIHTTPRequest ”,因为这不再被开发,我想问一下人们正在使用什么替代品,同时在我们的SDK上工作,我遇到了很多奇怪的行为在NSURLConnection从服务器接收数据时。

我们追踪到NSURLConnection在分块编码方面不能很好地处理响应。 或者至less是这样,我们在这里读到NSURLConnection和“chunked”转码

我们正在谈论的一些开发者说,在iOS 5中它变得更好,我们需要确保我们的SDK至less与iOS 4.3向后兼容。

我想确认这在NSURLConnection是一个问题,人们是如何处理它的。

到目前为止,我发现的所有替代方法都是基于NSURLConnection ,我假设这样做也会有相同的缺陷。 ASIHTTPRequest事实上起作用,因为它的基础比NSURLConnection稍微低一点,但是正在寻找不再支持的知识的替代品。

其他库的列表是: RestkitShareKitLRRestyAFNetworkingTTURLRequest

我知道这里也有类似的问题RESTkit是ASIHTTPRequest的一个很好的替代品吗? 这里ASIHTTPRequest替代scheme但是这两个解决scheme都基于NSURLConnection。

编辑:我注意到我在我的post开始时指出了错误的问题,所以更新。 它指向2008年的一个线程,我看过类似的,但没有最近。

分块传输由NSURLConnection支持。 我用它们。

  1. 定义一些道具:

     NSMutableData * responseData; NSURLConnection * connection; 
  2. build立连接

     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. 注册您build立连接的callback方法

     - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { // You may have received an HTTP 200 here, or not... [responseData setLength:0]; } 
  4. 注册您的“接收块”的callback方法

     - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSString* aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; NSLog(@"This is my first chunk %@", aStr); } 
  5. 注册您的“连接完成”callback:

     - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [connection release]; } 
  6. 最后,注册你的“连接失败”callback:

 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"Something went wrong..."); } 

只是为了给下一个来到这里的人提供帮助,仍然不能让NSURLConnection使用块编码的数据。

NSURLConnection将与分块编码一起工作,但是具有非公开的内部行为,使得它将在打开连接之前先缓冲512个字节,并通过响应头中的IF Content-Type让任何内容为“text / html”或“application /八位字节stream”。 这至less与iOS7有关。

但是,如果Content-Type设置为“text / json”,它不会缓冲响应。 所以,不能被分块编码的NSURLConnection响应工作(即不调用callback)应该检查响应头,并在服务器上将其更改为“text / json”,如果它不以其他方式中断应用程序行为。

没有任何我知道的替代品。

所有其他库都build立在NSURLConnection之上。 虽然你可以使用其中一个非iOS库,例如。 libcurl的。

ASIHTTPRequest是我所知道的唯一一个build立在CFNetworking层之上的库。 这是(也许是间接的)原始开发人员停止工作的主要原因 – 因为它不使用NSURLConnection它有很多的代码。

说ASIHTTPRequest不再被支持可能是不正确的。 确实,原来的开发人员不再工作,但如果你看看github的提交,你会发现它还在被其他人使用。 许多人仍然使用它,出于各种原因,包括我自己。

说了这么多,回到你有这个问题:我不知道一个3岁的线程是必要的参考certificateNSURLConnection 1岁的版本(即iOS 4.3)不支持分块传输。 在networking上使用了大量的分块传输,看起来不太可能会有这么大的问题。 有可能是你正在使用的服务器有一些非常特别的东西导致了这个问题。

Interesting Posts