有没有办法检索现有的 NSUrlSession/取消其任务?

Posted

技术标签:

【中文标题】有没有办法检索现有的 NSUrlSession/取消其任务?【英文标题】:Is there a way to retrieve an existing NSUrlSession/cancel its task? 【发布时间】:2017-12-09 12:30:07 【问题描述】:

我正在使用唯一标识符为后台上传创建 NSUrlSession。 有没有办法,比如在关闭并重新打开应用程序后,检索该 NSUrlSession 并取消上传任务,以防它尚未处理?

我尝试使用相同的标识符简单地重新创建 NSUrlSession 以检查它是否仍然包含上传任务,但是它甚至不允许我创建此会话,引发异常,例如“带有标识符的后台 URLSession ...已经存在",这并不奇怪,因为文档明确指出会话标识符必须是唯一的。

我正在尝试在 ios 平台项目中使用 Xamarin.Forms 2.3.4.270 执行此操作。

【问题讨论】:

【参考方案1】:

事实证明我是在正确的轨道上。错误消息“A background URLSession with identifier ... already exists”实际上似乎更像是一个警告,但实际上并没有抛出异常(我的异常实际上并不是来自重复会话创建)。

因此,您实际上可以重新附加到现有的 NSUrlSession 并且会发现包含的任务仍然存在,即使在重新启动应用程序之后也是如此。只需使用相同的标识符创建一个新配置,使用它来创建一个新会话,忽略打印出的警告,然后从那里继续。

我不确定这是否推荐用于生产,但它可以很好地满足我的需求。

private async Task EnqueueUploadInternal(string uploadId)

    NSUrlSessionConfiguration configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration(uploadId);
    INSUrlSessionDelegate urlSessionDelegate = (...);
    NSUrlSession session = NSUrlSession.FromConfiguration(configuration, urlSessionDelegate, new NSOperationQueue());

    NSUrlSessionUploadTask uploadTask = await (...);
    uploadTask.Resume();


private async Task CancelUploadInternal(string uploadId)

    NSUrlSessionConfiguration configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration(uploadId);
    NSUrlSession session = NSUrlSession.FromConfiguration(configuration); // this will print a warning

    NSUrlSessionTask[] tasks = await session.GetAllTasksAsync();
    foreach (NSUrlSessionTask task in tasks)
        task.Cancel();

【讨论】:

以上是关于有没有办法检索现有的 NSUrlSession/取消其任务?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让派生实例使用现有的基础实例

有没有办法将现有的 css 解析为 React Native css?

如何检索 websocket 连接列表?

OpenGL有没有办法复制现有的VAO

有没有办法将 Redis 层设置为 OpsWorks 中现有的 Rails 应用程序?

有没有办法配置 Elastic Beanstalk 以连接到现有的 Oracle 数据库(没有 BYOL)?