草庐IT

ios - NSURLSession 下载重新启动而不调用任何委托(delegate)

coder 2024-01-19 原文

我注意到我的应用程序中有一个与 NSURLSession 相关的奇怪行为。

我使用带有后台配置的 NSURLSession 开始下载,下载开始没有任何问题,但在某些时候,显然是随机的,它停止了几秒钟,然后重新启动而不调用除

之外的任何委托(delegate)
-URLSession: downloadTask: didWriteData: totalBytesWritten: totalBytesExpectedToWrite:

重置字节数。

谁能告诉我发生了什么事?

这是我初始化 session 的方式

if([[[UIDevice currentDevice]systemVersion] compare:@"8.0" options:NSNumericSearch] != NSOrderedAscending)
{
    sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionId];
}
else
{
    sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionId];
}

sessionConfiguration.HTTPMaximumConnectionsPerHost = kSimultaneousDownloads;
[sessionConfiguration setSessionSendsLaunchEvents:YES];
sessionConfiguration.discretionary = NO;

self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:self.backgroundQueue];

--编辑--

我听从了 Rob 的建议并使用 Charles 和 xCode debbuger 我发现事情发生的顺序是:

  1. 创建 session
  2. 调用getTasksWithCompletionHandler, session 中没有任务
  3. 开始下载任务
  4. 委托(delegate) URLSession:didReceiveChallenge:completionHandler: 被调用,我调用完成处理程序 completionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil);
  5. 来自 didWriteData: 的日志显示 id 为 1 的下载任务正在下载数据,下载在 Charles 上显示状态为 Receiving response body
  6. 在某个随机点,我可以看到 Charles 上的下载状态更改为“完成”,并且开始了新的下载
  7. 委托(delegate) URLSession:didReceiveChallenge:completionHandler: 被调用,我调用完成处理程序 completionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil);
  8. 来自 didWriteData: 的日志显示 id 为 2 的下载任务正在下载数据,新下载显示在 Charles 上,状态为 Receiving response body

最佳答案

一些建议:

  • 这里是否涉及任何重定向或身份验证挑战?您是否实现了这些委托(delegate)以查看那里是否发生了有趣的事情?

  • 你试过用Charles看这个吗?查看连接实际发生了什么?

    这对于诊断行为是由于连接中实际发生的事情还是我们的客户端代码导致的某些症状很有用。

  • 最后,您的 didWriteData 是否记录了任务 ID(因为在后台 session 中它可能会变得困惑,因为在应用程序的上一次运行中启动的下载可能会在您下次运行时完成应用程序)。

就我个人而言,最后一期是我第一次开始使用后台 session 时最让我受益的一期。我们已经习惯了在调试器中运行应用程序,然后停止并重新运行应用程序,而几乎没有我们之前 session 的残留影响。但是后台 session 很烦人,因为那些旧的请求会一直存在,除非你真的从设备/模拟器中删除应用程序。

关于ios - NSURLSession 下载重新启动而不调用任何委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275702/

有关ios - NSURLSession 下载重新启动而不调用任何委托(delegate)的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  5. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  6. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  7. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  8. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  9. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  10. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

随机推荐