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

pyr*_*nic 10 nsurlconnection asihttprequest chunked-encoding ios

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

我们追踪到的事实是,NSURLConnection它不能很好地处理分块编码中的响应.或者至少我们在这里阅读NSURLConnection和"chunked"转移编码这个问题

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

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

到目前为止,我发现的所有替代方案都是基于NSURLConnection并且我假设因此具有相同的缺陷.ASIHTTPRequest事实上确实有效,因为它的基础略低于NSURLConnection,但正在寻找不再支持的知识替代品.

其他的库列表看着是: Restkit, ShareKit, LRResty, AFNetworking, TTURLRequest

我知道这里有类似的问题RESTKit是ASIHTTPRequest的一个很好的替代品吗?这里ASIHTTPRequest替代方案但这两个解决方案都基于NSURLConnection.

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

Car*_*rdo 19

NSURLConnection支持分块传输.我用它们.

  1. 定义一些道具:

    NSMutableData * responseData;
    NSURLConnection * connection;
    
    Run Code Online (Sandbox Code Playgroud)
  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];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 注册建立连接的回调方法

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
         // You may have received an HTTP 200 here, or not...
         [responseData setLength:0];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 注册"chunk received"的回调方法

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

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
       [connection release];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  6. 最后,注册你"连接失败"回调:

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

  • http://i3.kym-cdn.com/photos/images/newsfeed/000/150/505/f30fd24c56e1bcfc926883d6a51d5a00.gif (2认同)

mak*_*ksa 9

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

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

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