繁体   English   中英

在Objective-C中从NSURLConnection切换到NSURLSession

[英]Switch from NSURLConnection to NSURLSession in Objective-C

我在Objective-C中有这个代码,它与NSURLConnection类的initWithRequest工作,Xcode给了我以下警告:

不推荐使用initWithRequest:首先在iOS9中弃用 - 使用NSURLSession

我的ViewController.m代码如下:

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

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

如果您想继续使用基于委托的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];

如果这样做,则必须符合NSURLSessionDelegateNSURLSessionTaskDelegateNSURLSessionDataDelegate方法,就像当前的NSURLConnectionDataDelegateNSURLConnectionDelegate方法一样。

顺便说一句,我dataTaskWithURL上面显示了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会话编程指南”中的“ 使用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。 NSURLSession仅在iOS 7及更高版本以及OS X v10.9及更高版本中可用。 如果您需要在此之前支持任何内容,则必须在不同的OS版本上使用不同的代码或坚持使用NSURLConnection。

考虑到NSURLConnection的部署范围很广,可以说它永远不会消失 - 以至于即使Apple有机会与tvOS彻底决裂,他们也选择保留它。

所以说实话,除非你有一些特别的理由要使用NSURLSession中的新功能,否则最好的方法可能是使用编译指示来清除编译器警告该代码,并使用NSURLSession来转发新代码(假设您不需要与不支持NSURLSession的旧操作系统兼容)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM