在 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];
Conexion
在 ViewController.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
方法,就像你当前的 NSURLConnectionDataDelegate
和 NSURLConnectionDelegate
方法一样。
顺便说一句,我在上面显示了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
一样,还有下载和上传特定的演绎版,downloadTaskWithURL
和 uploadTaskWithRequest
。
有关详细信息,请参阅 URL 会话编程指南中的 Using NSURLSession。
首先要问的是是否要更改 API。 NSURLSession 仅在 iOS 7 及更高版本以及 OS X v10.9 及更高版本中可用。如果您需要在此之前支持任何内容,则必须在不同的 OS 版本上使用不同的代码或坚持使用 NSURLConnection。
考虑到 NSURLConnection 的广泛部署,可以肯定地说它永远不会消失——以至于即使 Apple 有机会与 tv 彻底决裂OS,他们选择保留它。
所以老实说,除非你有一些特别的理由要使用 NSURLSession 中的新功能,否则最好的方法可能是使用 pragmas 来消除编译器对该段代码的警告,并使用 NSURLSession 来处理新的代码向前的代码(假设您不需要与不支持 NSURLSession 的旧 OSes 兼容)。
我在 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];
Conexion
在 ViewController.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
方法,就像你当前的 NSURLConnectionDataDelegate
和 NSURLConnectionDelegate
方法一样。
顺便说一句,我在上面显示了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
一样,还有下载和上传特定的演绎版,downloadTaskWithURL
和 uploadTaskWithRequest
。
有关详细信息,请参阅 URL 会话编程指南中的 Using NSURLSession。
首先要问的是是否要更改 API。 NSURLSession 仅在 iOS 7 及更高版本以及 OS X v10.9 及更高版本中可用。如果您需要在此之前支持任何内容,则必须在不同的 OS 版本上使用不同的代码或坚持使用 NSURLConnection。
考虑到 NSURLConnection 的广泛部署,可以肯定地说它永远不会消失——以至于即使 Apple 有机会与 tv 彻底决裂OS,他们选择保留它。
所以老实说,除非你有一些特别的理由要使用 NSURLSession 中的新功能,否则最好的方法可能是使用 pragmas 来消除编译器对该段代码的警告,并使用 NSURLSession 来处理新的代码向前的代码(假设您不需要与不支持 NSURLSession 的旧 OSes 兼容)。