对于分块传输编码,NSURLConnection的替代方法是什么

时间:2012-02-15 15:31:49

标签: ios nsurlconnection asihttprequest chunked-encoding

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

我们追踪到NSURLConnection不能很好地处理分块编码中的响应这一事实。或者至少我们在这里阅读了这个问题NSURLConnection and "chunked" transfer-coding

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

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

到目前为止,我发现的所有替代方案都基于NSURLConnection,我假设这样做会有同样的缺陷。事实上ASIHTTPRequest确实有效,因为它的基础略低于NSURLConnection,但正在寻找不再支持知识的替代方案。

其他图书馆的列表是: RestkitShareKitLRRestyAFNetworkingTTURLRequest

我知道这里有类似的问题Is RESTKit a good replacement for ASIHTTPRequest?ASIHTTPRequest alternative但这两个解决方案都基于NSURLConnection。

编辑:我注意到我在帖子的开头指出了错误的问题,所以更新了。它指向了2008年的一个主题,我看到了类似的但最近都没有。

3 个答案:

答案 0 :(得分:19)

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. 最后,注册“连接失败”回调:

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

答案 1 :(得分:9)

只是为了下一个到达这里的人,但仍然无法使用NSURLConnection来处理块编码数据。

NSURLConnection将使用分块编码,但具有未公开的内部行为,以便在打开连接之前缓冲前512个字节,并通过响应头中的IF Content-Type让任何内容为" text / html& #34;,或" application / octet-stream"。这至少与iOS7有关。

但是,如果Content-Type设置为" text / json"它不会缓冲响应。因此,无论谁都无法获得分块编码的NSURLConnection响应(即不调用回调),应该检查响应头并将其在服务器上更改为" text / json"如果它没有以其他方式破坏应用程序行为。

答案 2 :(得分:2)

我没有任何其他选择。

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

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

说不再支持ASIHTTPRequest可能并不完全正确。确实,原始开发人员不再使用它,但是如果你看一下github提交,你会发现它仍在被其他人处理。很多人仍然使用它,出于各种原因,包括我自己。

说了这么多,回到你所遇到的问题:我不确定一个3岁的线程是否必然是证明NSURLConnection的1年发行版(即iOS 4.3)的确定参考支持分块转移。网络上使用了分块传输,以至于它似乎不太可能出现如此大而明显的问题。

可能会导致您使用的服务器非常特殊。