【问题标题】:Ideal value for the URLSession - delegateQueue in SwiftURLSession 的理想值 - Swift 中的 delegateQueue
【发布时间】:2021-04-09 23:22:04
【问题描述】:

我们有一个通用的 Requesthandler.swift 文件来处理 get、post http 方法。我们在整个应用程序中使用此文件来进行 http 请求。 当我们初始化 URLSession 时,delegateQueue 的值应该是什么。

let session = URLSession(configuration: config, delegate: self, delegateQueue:OperationQueue.main)

【问题讨论】:

  • 这在很大程度上取决于委托方法中的代码。
  • @vadian 你需要什么信息才能得到明确的答案。

标签: ios objective-c swift3 swift5


【解决方案1】:

如果您在整个应用程序中对所有 http 使用它,这是正确的做法。但是,我建议 不要 创建您自己的会话。已经有一些确切的东西,那就是URLSession.shared,尽管有(只是一些)限制,如文档中讨论的那样。

如果您可以忍受这些限制,请使用共享会话;否则按照 Rob 的建议使用 nil,或者如果您 DIY 队列,那么您确实想要使用 main 作为您的委托队列。你肯定想要一个后台队列。如果您 DIY,那么您可能会创建一个单例队列并将其用于所有请求并根据口味对其进行配置(并使其串行 - 请参阅 Rob 的答案)。

最后,由于委托会在委托队列上调用完成,NOT main,所以当你需要更新 UI 时,你应该在完成中切换到 main,所以可能会有一个很多切换到主那里。这没有错,也没有告诉你使用 main 作为队列。

【讨论】:

  • "如果为 nil,则会话创建一个串行操作队列,用于执行所有委托方法调用和完成处理程序调用。"这个串行队列会在主线程中运行吗?
  • @Shamil 我看到你有这个答案。再次注意我的建议。我认为您通过在一个地方执行所有 http 所做的事情是正确的。然后,如果可能,请使用共享会话,例如[NSURLSession.sharedSession downloadTaskWithURL:remoteUrl completionHandler:...[NSURLSession.sharedSession dataTaskWithURL:remoteUrl completionHandler:....
  • PS:基于其他一些 cmets。这个stackoverflow.com/questions/20604910/…也讨论了数据和下载任务的区别。
【解决方案2】:

关键考虑是队列应该是串行队列。正如the docs 所说:

队列应该是串行队列,以确保回调的正确顺序。

因此,如果您实例化自己的OperationQueue,请确保将其maxConcurrentOperationCount 设置为1

文档继续说:

如果[委托队列是]nil,会话将创建一个串行操作队列,用于执行所有委托方法调用和完成处理程序调用。

因此,我们通常将其保留为nil,并让URLSession 为我们处理。

不过,通常不会使用main 队列。这在很大程度上是一个约定问题(如URLSession.shared,如果我们不需要委托方法或自定义行为,我们通常使用它,使用串行后台队列)。这种使用串行后台队列的做法是可取的,因为您可以降低委托方法或完成处理程序中的一些慢速解析操作(或其他)会影响您的主线程响应能力的风险。话虽如此,每当使用串行后台队列时,请确保将 UI 更新(等)分派回主队列。

【讨论】:

  • "如果为 nil,则会话创建一个串行操作队列,用于执行所有委托方法调用和完成处理程序调用。"这个串行队列会在主线程中运行吗?
  • 当你(或URLSession)创建队列时,它通常不在主线程上运行。所以,使用nil,让URLSession 实例化一个串行后台队列,然后如果您有必须在主线程上运行的东西(例如UI 更新等),然后手动将其分派回主队列。
  • 如果你设置为 nil。它是背景还是主要。我的意思是默认情况下
  • 如果您提供nil,它将创建一个后台串行队列。这不是主队列。
  • 谢谢@Rob。正如我们所知,后台队列或线程与后台时的应用程序不同。如果 api 正在运行,如果 App 突然进入后台,则整个 api 都将失效。这种情况如何处理?
猜你喜欢
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多