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

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

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

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

【问题讨论】:

    标签: c# ios xamarin.forms


    【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 2010-11-04
      • 2019-12-09
      • 2019-09-18
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多