NSURLSession vs NSURLConnection [吐槽]

2015-08-19 16:58:15 +08:00
 rotoava

从 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 会是什么命运?

2264 次点击
所在节点    iDev
2 条回复
husinhu
2015-08-19 23:49:34 +08:00
很久没做 iOS 了,之前看 Mattt 说 AFNetworking 现在底层也是用了 URLSession ?
rotoava
2015-08-20 09:21:21 +08:00
@husinhu AFNetworking 底层走 NSURLConnection 和 URLSession 两条路,可选。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/214337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX