当我尝试使NSURLSession实例无效时,我有一个奇怪的问题.
代码很简单:我有一个视图控制器,两个按钮(开始:和停止:)和一个文本字段的url.
代码很简单:我有一个视图控制器,两个按钮(开始:和停止:)和一个文本字段的url.
- (IBAction)start:(id)sender { NSURLSessionConfiguration *conf = [NSURLSessionConfiguration backgroundSessionConfiguration:@"conf"]; self.session = [NSURLSession sessionWithConfiguration:conf delegate:self delegateQueue:nil]; NSURLSessionDownloadTask *task = [self.session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.url.text]]]; [task resume]; } - (IBAction)cancel:(id)sender { [self.session invalidateAndCancel]; }
或者,如果您愿意,整个项目:Link
现在,尝试下载一个文件(http://download.thinkbroadband.com/1GB.zip).
由于我希望这个下载在后台继续,所以我正在使用一个后台会话.
会话启动正确,下载在后台继续,但如果我尝试取消它(发送invalidateAndCancel),我有一个坏的访问.
使用Zombie进行分析功能可以让这个僵尸对象:_NSCFBackgroundDownloadTask.
所以,如果我保留NSURLSessionDownloadTask(使用强大的属性存储它)不会发生坏的访问.
但是,AFAIK,NSURLSession应该保留它的任务本身,所以我想了解我的代码有什么问题(也许我在文档中缺少某些东西?)或者我应该提交bug报告.
谢谢
解决方法
>请使用更好的后台会话配置标识符!这不是你的会话后台会话是进入共享系统会话的一种网关.您需要将会话的任务与所有其他应用程序进行背景上传和下载区分开来.使用独特的东西,如@“com.company.appname.specialname”. >取消和无效的背景会话没有什么意义.你正在杀死会议;无效后,您将无法再使用它.太傻了您想要做的是创建一个后台会话,一旦您的应用启动,并将其永久保存(作为通向共享系统会话的网关,如前所述).你想取消什么,如果你想取消某事,是任务.保留对任务的引用,以便您可以说取消参考,如果您认为您要取消该引用.或者,如果您真的不想保留对该任务的引用,可以通过调用getTasksWithCompletionHandler :;来向NSURLSession询问当前任务的列表.一个任务可以有一个标识符,所以找到一个你应该没有问题,并告诉它取消.