从 NSURLSession 和 NSURLConnection 的代理方法看看两者的设计区别
#pragma mark NSURLSessionDataDelegate & NSURLSessionTaskDelegate
- (void )URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition ))completionHandler {
completionHandler (NSURLSessionResponseAllow );
}
- (void )URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
}
- (void )URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
if (error ) {
// Handle error
}
else {
NSLog (@"success");
}
}
#pragma mark NSURLConnectionDelegate
- (void )connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
}
- (void )connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
}
- (void )connectionDidFinishLoading:(NSURLConnection *)connection
{
}
区别
1. 上面用到 URLSession 的 3 个代理回调函数来自两个于 protocol ,虽然分的的更细,但是也更杂乱。
2. URLSession 第一个代理函数 didReceiveResponse ,必须执行附带的 block : completionHandler (NSURLSessionResponseAllow )
要不然后面不会发生任何执行,默认设置: didReceiveResponse 就默认取消了这个任务。不符合人类常理啊。
3. URLSession 的第二个代理 didReceiveData ,和 URLProtocol 的 didLoadData 不再直接关联。 didReceiveData 的数据计算下载进度不准,数值变化也不平缓。
4 URLSession 的第三个代理 didCompleteWithError ,为什么就默认是 erro 呢?不看文档的话,我还会期待一个 success 回调的。但其实 erro 为 nil 就是成功。感觉不符合人类常理。
5 NSURLConnection 的代理设计简单明了好用。
6 URLSession 刚出来的时候 Mattt 大神( AFnetworking 作者)在博文里也赞扬和认同 URLSession 的设计,但是感到是客气话。
7 感觉 URLSession 封装的太过头了,也没 AFnetworking 设计的好用。同时也失去了 NSURLConnection 灵活性,感觉 URLRequest 、 URLprotocol 的整个了流程也被改的不如以前明了。
大家在用的时候有什么感觉?是我不够与时俱进? 还有 iOS9 来的时候 NSURLConnection 会是什么命运?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.