我已经检查了与此相关的其他问题,但唯一的答案是“使用ASIHTTPRequest
”,因为这已经不再开发了我想问一下人们在使用我们的SDK时使用的替代方案从服务器接收数据时,NSURLConnection
遇到了很多奇怪的行为。
我们追踪到NSURLConnection
不能很好地处理分块编码中的响应这一事实。或者至少我们在这里阅读了这个问题NSURLConnection and "chunked" transfer-coding
我们正在谈论的一些开发人员说它在iOS 5中变得更好,我们需要确保我们的SDK至少与iOS 4.3向后兼容。
我想确认这在NSURLConnection
中是一个问题,以及人们如何处理它。
到目前为止,我发现的所有替代方案都基于NSURLConnection
,我假设这样做会有同样的缺陷。事实上ASIHTTPRequest
确实有效,因为它的基础略低于NSURLConnection
,但正在寻找不再支持知识的替代方案。
其他图书馆的列表是:
Restkit
,
ShareKit
,
LRResty
,
AFNetworking
,
TTURLRequest
我知道这里有类似的问题Is RESTKit a good replacement for ASIHTTPRequest?和ASIHTTPRequest alternative但这两个解决方案都基于NSURLConnection。
编辑:我注意到我在帖子的开头指出了错误的问题,所以更新了。它指向了2008年的一个主题,我看到了类似的但最近都没有。
答案 0 :(得分:19)
NSURLConnection支持分块传输。我用它们。
定义一些道具:
NSMutableData * responseData; NSURLConnection * connection;
建立连接
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];
注册建立连接的回调方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { // You may have received an HTTP 200 here, or not... [responseData setLength:0]; }
注册“收到块”的回调方法
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSString* aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; NSLog(@"This is my first chunk %@", aStr); }
注册“已完成连接”回调:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection { [connection release]; }
最后,注册“连接失败”回调:
- (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)的确定参考支持分块转移。网络上使用了分块传输,以至于它似乎不太可能出现如此大而明显的问题。
可能会导致您使用的服务器非常特殊。