在 Objective-C 中从 NSURLConnection 切换到 NSURLSession

Switch from NSURLConnection to NSURLSession in Objective-C

我在 Objective-C 中有这段代码,它与 NSURLConnection class 的 initWithRequest 一起使用,Xcode 给了我以下警告:

initWithRequest is deprecated: first deprecated in iOS9 - Use NSURLSession

我的ViewController.m代码如下:

NSString url = "my url"; 
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
conexion = [[NSURLConnection alloc]initWithRequest:req delegate:self];

ConexionViewController.h 中是 NSURLConnection,所以我想知道如何从 NSURLConnection 切换到 NSURLSession

    NSURL *URL = [NSURL URLWithString:url];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                        completionHandler:
                              ^(NSData *data, NSURLResponse *response, NSError *error) {
                                  // ...
                              }];

[task resume];

如果您想继续使用基于委托的 API,就像您当前的实现一样,它是:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

NSURL *URL = [NSURL URLWithString:string];

NSURLSessionTask *task = [session dataTaskWithURL:URL];
[task resume];

如果你这样做,你必须遵守 NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate 方法,就像你当前的 NSURLConnectionDataDelegateNSURLConnectionDelegate 方法一样。

顺便说一句,我在上面显示了dataTaskWithURL,但是如果你真的需要使用NSURLRequest(例如你打算做POST或其他请求),有dataTaskWithRequest,也是。

话虽如此,使用完成处理程序再现要容易得多,而不必编写所有这些委托方法:

NSURLSession *session = [NSURLSession sharedSession];

NSURL *URL = [NSURL URLWithString:string];

NSURLSessionTask *task = [session dataTaskWithURL:URL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // process response here
}];
[task resume];

如果这样做,您就不必实现任何这些委托方法。它类似于 NSURLConnection 便捷方法 sendAsynchronousRequest,只是它是可取消的。

而且,就像上面的 dataTaskWithURL 一样,还有下载和上传特定的演绎版,downloadTaskWithURLuploadTaskWithRequest

有关详细信息,请参阅 URL 会话编程指南中的 Using NSURLSession

首先要问的是是否要更改 API。 NSURLSession 仅在 iOS 7 及更高版本以及 OS X v10.9 及更高版本中可用。如果您需要在此之前支持任何内容,则必须在不同的 OS 版本上使用不同的代码或坚持使用 NSURLConnection。

考虑到 NSURLConnection 的广泛部署,可以肯定地说它永远不会消失——以至于即使 Apple 有机会与 tv 彻底决裂OS,他们选择保留它。

所以老实说,除非你有一些特别的理由要使用 NSURLSession 中的新功能,否则最好的方法可能是使用 pragmas 来消除编译器对该段代码的警告,并使用 NSURLSession 来处理新的代码向前的代码(假设您不需要与不支持 NSURLSession 的旧 OSes 兼容)。