URLSessionTask如何运行

2024-04-03

假设我创建了一个实例URLSessionTask:

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
   print (\(Thread.current))
}
// I start the task by
task.resume()

我想了解是否URLSessionTask实例正在运行main默认情况下或在背景线。所以,我打印Thread.current .

当我运行我的代码时,它打印出:

<NSThread: 0x170273980>{number = 4, name = (null)}

我的问题是:

  1. 哪个线程URLSessionTask默认运行吗?主线程还是后台线程?

  2. 为什么当前线程在线程中显示为空name?这是否意味着它默认在后台线程中运行? (我看到 name="main" 为print在主线程上)

  3. 一般来说,是否需要运行URLSessionTask是否使用GCD强制它在后台线程中运行?我问这个是因为我看到一些教程不使用GCD来运行URLSessionTask,他们只使用 GCD 在主线程中运行完成处理程序。


简短回答:关键的观察是URLSessionTask始终相对于您启动它的线程异步运行。除非您明确指定,否则完成处理程序和/或委托方法将在后台线程上运行。因此,在发起请求时不必使用 GCD,但在完成处理程序中,我们将使用 GCD 将更新 UI 或模型的任何内容分派到主队列。


你问:

  1. 哪个线程URLSessionTask默认运行吗?主线程还是后台线程?

实际上有两个问题:哪个线程URLSession在内部用于其自身目的以及将运行完成处理程序和/或委托方法的线程。

关于前一个问题,这是一个内部实现细节,没有在任何地方记录,但它似乎创建了自己的(后台)线程,并带有单独的运行循环来处理请求。但这些实现细节通常并不重要:我们确信请求是异步运行的(不会阻塞当前线程)。

后一个问题,即在哪个线程上调用完成处理程序和委托方法,通常更为重要。除非我们另有说明,URLSession在串行操作队列上运行完成处理程序和委托方法URLSession为我们创造的。这意味着它们在后台线程上运行。

此规则的唯一例外是如果您指定OperationQueue.main as the queue实例化时的参数URLSession,在这种情况下,它显然会使用主线程来完成处理程序和委托方法。但即使在这种情况下,请求也会异步运行URLSession不会阻塞主线程。

  1. 为什么当前线程的线程名称显示为 null?这是否意味着它默认在后台线程中运行? (我看到 name="main" 在主线程上打印)

它在串行操作队列上运行。操作队列线程使用的线程通常没有名称。但你可以看看OperationQueue.current?.name确认正在使用哪个操作队列。

  1. 一般来说,是否需要运行URLSessionTask是否使用GCD强制它在后台线程中运行?我问这个是因为我看到一些教程不使用GCD来运行URLSessionTask,他们只使用 GCD 在主线程中运行完成处理程序。

这些教程建议的流程是正确的。发起请求时不必使用 GCD。它始终相对于您启动它的队列异步运行。您唯一需要做的就是将完成处理程序或委托方法中的相关代码分派到适当的队列。

具体来说,由于我们通常让URLSession在其自己的串行队列上运行完成处理程序,因此我们必须将 UI 更新分派回主队列。有时会被忽视,我们通常也会将模型更新分派回主队列(或使用其他一些同步机制)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

URLSessionTask如何运行 的相关文章

随机推荐

  • 将模型应用于多个时间序列

    假设我有多个时间序列需要预测 如果我为每个对象都有适当的时间序列对象 我可以拟合 为了示例 ARIMA 模型等等 但是 我知道当所有系列都在一个中时 必须有一种简单的方法来自动化此过程xts对象 暂且不说不同的变量可能需要不同的 ARIMA
  • 反序列化匿名 JSON 数组?

    我有一个想要反序列化的匿名数组 这里是第一个数组对象的示例 time 08 55 54 date 2016 05 27 timestamp 1464332154807 level 3 message registerResourcePath
  • angular-google-maps 搜索功能的工作示例

    有没有人有一个有效的搜索框示例 例如 angular google maps team 在本网站的 搜索框 下显示的搜索框 https angular ui github io angular google maps api https a
  • 将对象初始化为全零

    通常 数据结构的有效初始化是将所有成员设置为零 即使在使用 C 进行编程时 也可能需要与外部 API 进行交互 这种情况就是如此 之间有什么实际区别 some struct s memset s 0 sizeof s 简单地 some st
  • 当指定为对象属性时,IIFE 如何影响其中的此关键字

    var a name Rhona check function return this name console log a check This returns 一个空字符串我希望它返回 Rhona 它没有给出 undefined 或 n
  • 为什么 ToUpperInvariant() 比 ToLowerInvariant() 更快?

    我在 CLR via C 中读到 Jeffrey Richter 写的String ToUpperInvariant 比String ToLowerInvariant 他说这是因为 FCL 使用 ToUpperInvariant 来规范化字
  • 更改内存提供程序的默认用户对象

    我只是想更改默认值User内存中提供程序的对象 默认User对象是Symfony Component Security Core User User 但是这个对象不能满足我的要求 所以我复制了该对象并添加了一些满足我的要求的属性 然后将其命
  • getmtime() 与 datetime.now():

    此代码每年在时钟转换的晚上打印一次错误警告 中欧夏令时间到中欧时间 import os import datetime now datetime datetime now age now datetime datetime fromtime
  • Git:在一个命令中搜索所有提交消息、分支名称、提交内容

    我想搜索所有可能的引用 提交 分支 标签 所有提交消息 所有分支名称和所有提交内容 由于还没有人建议一系列命令 并且如果您还没有自己制作它 git config alias findall f echo e nFound in refs n
  • 是否可以在远程服务器上运行 matlab 并使用瘦客户端上的 matlab GUI 对其进行控制?

    类似于 emacs 与 slime 的功能 核心服务可以在高性能远程计算机上运行 而我可以在上网本上从 emacs gui 编辑和运行代码 我和我的同事经常需要用机器做一些demo 学习在matlab中运行的脚本 这需要我们随身携带笨重的笔
  • HTML Web Worker 和 Jquery Ajax 调用

    我想知道是否可以在 Web Worker 文件中使用 jQuery Google Chrome 给我这个错误 Uncaught ReferenceError 未定义 这是代码 父文件 var loader new Worker BASE U
  • 错误:php55w-common 与 CentOS 6.5 上的 php-common 冲突

    我已经安装了新的 64 位 CentOS 6 5 带有 PHP5 Mysql5 5 等 现在 当我想安装不同的 apache 模块 例如 php soap 时 我收到此错误 gt Package php soap x86 64 0 5 3
  • 默认 Android 浏览器的浏览器插件

    我想为默认的 android 浏览器开发一个插件 它将指定 google 搜索结果中的网站类别 Android 浏览器没有明确显示插件架构 我想知道如何做到这一点以及与之相关的任何参考资料 Thanks 我最近尝试制作一个android插件
  • 是否可以分离 Hibernate 实体,以便对对象的更改不会自动保存到数据库?

    我有必须转换为 JSON 的 Hibernate 实体 并且必须翻译实体中的一些值 但是当我翻译值时 这些值会立即保存到数据库中 但我不想将这些更改保存到数据库中 有解决这个问题的方法吗 您可以通过调用来分离实体Session evict
  • 清空用户定义类内的 std::vector 时未释放内存

    当我们遇到一些内存问题时std vector是一个类的一个字段 我们用大量数据填充这个向量 在程序的某个点需要释放这些数据 然而 即使向量容量为零 内存也没有被释放或完全释放 这里您有我们程序的简化版本 正如你所看到的 类Foo只有一个字段
  • 移动装箱函数时“无法移动 FnOnce 类型的值”

    我正在尝试用 Rust 进行一些高阶编程 但在处理闭包时遇到一些困难 这是一个代码片段 说明了我遇到的问题之一 pub enum Foo Bar Box
  • 有没有办法批量读取firebase文档

    我正在使用 flutter 制作一个移动应用程序 并以 firebase 作为后端 我有一个存储用户信息的用户文档集合 其中一个字段是一组引用 另一个集合中的引用文档 我想在像批处理这样的操作中使用它 然后允许读取所有文档 我知道批处理只允
  • Sequelize:查找没有关联的条目

    给出以下简单模型 class A extends Model A init aField DataTypes STRING sequelize class B extends Model B init bField DataTypes ST
  • 如何模拟应用程序更新

    我正在使用 SQLite 来存储一些数据 最近 一位用户向我投诉 每次更新应用程序时 数据库都会被擦除 我想解决这个问题 但首先我需要模拟应用程序更新 而不是将其上传到 google play 并等待 您无需将apk上传到google 您可
  • URLSessionTask如何运行

    假设我创建了一个实例URLSessionTask let task URLSession shared dataTask with url data response error in print Thread current I star