V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
rotoava
V2EX  ›  iDev

NSURLSession vs NSURLConnection [吐槽]

  •  
  •   rotoava · 2015-08-19 16:58:15 +08:00 · 2282 次点击
    这是一个创建于 3410 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    2 条回复    2015-08-20 09:21:21 +08:00
    husinhu
        1
    husinhu  
       2015-08-19 23:49:34 +08:00
    很久没做 iOS 了,之前看 Mattt 说 AFNetworking 现在底层也是用了 URLSession ?
    rotoava
        2
    rotoava  
    OP
       2015-08-20 09:21:21 +08:00
    @husinhu AFNetworking 底层走 NSURLConnection 和 URLSession 两条路,可选。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5117 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:27 · PVG 17:27 · LAX 01:27 · JFK 04:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.