iOS9中NSURLConnection已被弃用

19
我希望能够使用NSURLRequest下载文件并保存,但是在NSData * data = ...这一行出现了错误。
NSURL *Urlstring = [NSURL URLWithString:@"http://yourdomain.com/yourfile.pdf"];
NSURLRequest *request = [NSURLRequest requestWithURL: Urlstring];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"];

[data writeToURL:documentsURL atomically:YES];

警告信息显示我应该使用NSURLSession dataTaskwithrequest,因为sendSynchronousRequest在iOS 9中已被弃用,但那并没有起作用。希望有人可以帮助我。


2
“已弃用”不是错误。它是一个警告,表示某些内容将来会被移除。如果您遇到实际的错误,那很可能是由于其他原因引起的。 - Phillip Mills
1个回答

34

现在你必须使用NSURLSession

示例(GET):

-(void)placeGetRequest:(NSString *)action withHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))ourBlock {

    NSString *urlString = [NSString stringWithFormat:@"%@/%@", URL_API, action];


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

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:ourBlock] resume];
}
现在,您需要使用操作(或完整的URL,如果您愿意)以及在API调用返回时将被执行的块来调用该方法。
[self placeGetRequest:@"action" withHandler:^(NSData *data, NSURLResponse *response, NSError *error) {    // your code}];

在这个区块中,您将收到一个包含响应数据的NSData和HTTP响应的NSURLResponse。现在,您可以将您的代码放在这里:

NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"];

[data writeToURL:documentsURL atomically:YES];

NSURLConnection和NSURLSession的主要区别

  • NSURLConnection:如果我们使用NSURLConnection打开连接,并且系统中断了我们的应用程序,当我们的应用程序进入后台模式时,我们接收或发送的所有内容都会丢失。 NSUrlConnection的流程图

  • NSURLSession:解决这个问题并为我们提供了进程外下载。即使我们没有访问权限,它也可以管理连接过程。您需要在AppDelegate中使用application:handleEventsForBackgroundURLSession:completionHandlerNSURLSession的流程图

因此,使用NSURLSession,您不需要管理或检查您的互联网连接,因为操作系统会替您完成。


好的,谢谢。但是ourBlock是什么?它显示为未声明的标识符。 - Maximilian
哦,是的!ourBlock 是一个你必须定义的块。它应该包括当 API 调用完成时要执行的源代码。我会编辑我的答案,给你一个完整的例子。 - EnriMR
@Maximilian,请现在检查我的更新答案并在您的项目中测试它。 - EnriMR
@EnriMR,看起来dataTaskWithRequest缺少resume,是吗? [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:ourBlock] resume]; - Eugene Braginets
1
是的,缺少简历。如果没有它,似乎执行永远不会到达ourBlock。 - diidu
是的,我忘了,我已经意识到@diidu已经修复了它 ;) - EnriMR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接