gpt4 book ai didi

ios - NSURLSession 失效并取消 : Bad Access

转载 作者:技术小花猫 更新时间:2023-10-29 11:11:22 26 4
gpt4 key购买 nike

当我尝试使 NSURLSession 实例无效时,我遇到了一个奇怪的问题。代码非常简单:我有一个 View Controller 、两个按钮(开始:和停止:)和一个用于 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 )。

因为我希望此下载在后台继续,所以我正在使用后台 session 。
session 正确启动,下载在后台继续,但如果我尝试取消它(发送 invalidateAndCancel),我无法访问。
在启用 Zombie 的情况下进行分析,给出此僵尸对象:_NSCFBackgroundDownloadTask
因此,如果我保留 NSURLSessionDownloadTask(使用强大的属性来存储它),则不会发生错误访问。但是,据我所知,NSURLSession 应该保留它本身的任务,所以我想了解我的代码有什么问题(也许我在文档中遗漏了什么?)或者我是否应该提交错误报告。

谢谢

最佳答案

  1. 请使用更好的后台 session 配置标识符!这不是你真正的 session ;后台 session 是一种进入共享系统 session 的网关。您需要将 session 的任务与所有其他在后台上传和下载的应用程序的任务区分开来。使用独特的名称,例如 @"com.company.appname.specialname"

  2. 取消和使后台 session 无效没有多大意义。你正在终止 session ;使它无效后,您将永远无法再次使用它。太傻了。您想要做的是在您的应用程序启动时创建一次后台 session ,然后将其永远保留在那里(如我之前所说,作为共享系统 session 的网关)。如果您想取消某事,您想要取消的就是任务。保留对该任务的引用,以便在您认为要取消它时可以对该引用说 cancel。或者,如果您真的不想保留对任务的引用,您可以通过调用 getTasksWithCompletionHandler: 向 NSURLSession 请求当前任务的列表;一项任务可以有一个标识符,因此找到您想要的任务并告诉它取消应该没有问题。

关于ios - NSURLSession 失效并取消 : Bad Access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com