从 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 会是什么命运?
1
husinhu 2015-08-19 23:49:34 +08:00
很久没做 iOS 了,之前看 Mattt 说 AFNetworking 现在底层也是用了 URLSession ?
|