切换到异步网络 API,例如 URLSession

2024-01-10

这是什么意思?我尝试了这个......仍然,它给了我同样的信息:

DispatchQueue.main.async {
    if let imageData = try? Data(contentsOf: url) {
        self.image = UIImage(data: imageData)
    }
}

正如消息所说,这意味着Data(contentsOf:) call 在获取数据之前不会返回,如果图像很大并且网络很慢,这可能会很慢。当您从主线程调用此函数时,在最坏的情况下,整个应用程序 UI 将冻结几秒钟。

编译器/运行时只是通过返回此错误消息来帮助您避免这种潜在的陷阱,其中包含有关如何解决问题的明确指示:使用URLSession.shared.dataTask(with:completionHandler:)代替Data(contentsOf:).

func setImageFromStringrURL(stringUrl: String) {
  if let url = URL(fromString: stringUrl) {
    URLSession.shared.dataTask(with: url) { (data, response, error) in
      // Error handling...
      guard let imageData = data else { return }

      DispatchQueue.main.async {
        self.image = UIImage(data: imageData)
      }
    }.resume()
  }
}

该方法不会阻塞主线程。相反,它会安排网络调用在后台线程上执行,并在获取数据后执行您提供的回调(负责更新 UI)。

由于回调也在后台线程上执行,并且 UI 更新必须在主线程上进行,因此您仍然需要显式安排要在主线程上执行的 UI 更新:DispatchQueue.main.async.

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

切换到异步网络 API,例如 URLSession 的相关文章

随机推荐

  • 在开发环境中使用 Facebook 身份验证

    当使用 OAuth2 在客户端服务器端模式下使用 facebook 身份验证时 是否有任何方法可以在使用重定向 uri 的本地开发环境时对其进行测试 显然 您可以指定您的 IP 并将该 IP 上的端口 80 路由到您的计算机 但是是否有更简
  • 执行 S3 标准存储类别的策略

    有没有办法定义 S3 存储桶策略来强制实施标准存储类别 我想阻止用户创建具有减少的冗余存储类别的对象 您现在可以在 S3 存储桶策略中使用条件来限制 S3 对象的创建 使用PutObject 到特定的存储类别 当前版本的 AWS 文档有一个
  • 在 Rails 上创建多对多记录

    我有一个简单的任务列表应用程序 其中包含用户和列表 用户由 Devise 管理 并且可以创建任务列表以及其他用户或他们自己创建的收藏夹列表 用户和列表之间的所有权关系很容易建立 但我在设置喜欢列表的用户的关系时遇到困难 我设想它毕竟是一种多
  • 列结合行运算的最小值(大于0)

    我试图从矩阵中的列中获取最小值 大于 0 然后使用该最小值出现的行号来计算一个值 该值 作为公式 应用于最小行 已识别 下方的所有行之前 让我用一个例子来演示一下 如果我将 x 定义为 x lt rbind c 0 0 0 c 0 0 3
  • 更新到 R 3.4 后,RStudio 看不到软件包 [重复]

    这个问题在这里已经有答案了 我有 Ubuntu 16 04 将 R 更新到 3 4 1 版本后 它看不到我的软件包 即使它们也已更新 gt library dplyr Error in library dplyr there is no p
  • 当用户点击刷新时处理ajax错误

    如果这是我应该能够查找的内容 我深表歉意 我想要的所有术语都超载了 这是我的问题 当我打开一个页面时 它会触发一系列的 ajax 调用 如果我然后按 Shift Refresh 所有这些 ajax 调用都将被视为错误 并在整个页面本身重新加
  • 在Django中设置多个同名的cookie

    有没有办法在同一响应中为多个域或路径设置具有相同名称的 cookie 以下仅设置第二个 cookie response set cookie alice 123 domain sub example com response set coo
  • 我可以从另一个 shell 脚本调用一个 shell 脚本的函数吗?

    我有 2 个 shell 脚本 第二个shell脚本包含以下函数第二个 sh func1 func2 第一个 sh 将使用一些参数调用第二个 shell 脚本 将使用特定于该函数的一些其他参数来调用 func1 和 func2 这是我正在谈
  • 如果用户不打开 iCloud Drive,带有 CloudKit 的应用程序会受到哪些限制

    如果用户未打开 iCloud Drive 哪些 CloudKit 服务将无法使用 有什么办法可以从应用程序打开 iCloud Drive 吗 我想无论 iCloud Drive 从公共容器下载记录都应该可以工作 只有在启用时才写入容器 Ap
  • android inputType=手机不工作

    我试图让 inputType phone 始终如一地工作 它在一个项目中完美运行 但我无法让它在任何其他项目中运行 我所说的 工作 是指该数字在键入值时并未格式化 这是一个不起作用的测试项目
  • 如何将 Kestrel 配置为使用随机动态端口并在 ASP.NET Core 3.1 运行时确定端口?

    通过 ASP NET Core 3 0 我已经能够使用它IHostedService方法 确定 Kestrel 绑定的端口 https stackoverflow com questions 49871318 determine port
  • 尽管对象位于数组中,indexOf 返回 -1 - Google 电子表格脚本中的 Javascript

    我正在为 Google Docs 电子表格编写一个脚本 以读取董事列表并将其添加到数组中 如果它们尚未出现在数组中 但是 对于数组中包含的元素 我似乎无法让 indexOf 返回除 1 之外的任何内容 谁能告诉我我做错了什么 或者指出我有一
  • NHibernate fetch="join" 映射属性似乎不起作用

    用 NH 映射字典 声明如下
  • 编程语言中的构造函数

    Why constructor不被视为member一个班级的 有什么具体原因吗 感谢致敬 我拒绝这个问题的前提 构造函数isC 中的类或结构的成员 我建议您参考 C 规范的第 3 4 4 节 类成员 其中枚举了类的成员 类声明可以包含 常量
  • 模板模板非类型参数

    我不太确定 C 中是否有这样的功能 如果有的话我似乎无法让它工作 所以我决定问一下 我可以有一个模板模板非类型参数吗 像这样的事情 template
  • 了解如何在没有 C# Cmdlet 定义的情况下将详细或调试字符串消息写入 PowerShell 运行空间

    我有一个 C 类库 它提供了许多可以从 PowerShell 脚本 PS1 和高级模块 PSM1 调用的接口 我有一个静态方法可以使用以下命令将详细消息和调试消息写入控制台System Console class public class
  • 基于 geom_map 或 ggplot2 中的列联表 (2x2) 创建唯一的图例?

    我该如何根据这个列联表来做到这一点 我不完全确定如何根据我制作的指标表 犯罪 在 R 中创建自定义图例 R 中的可重现代码 require maps set seed 123 randomly assign 2 variables to e
  • 如何在MAUI中设置ContentPage全屏(或沉浸式)?

    是否有一个属性可以设置页面全屏显示 在 Xamarin 中 可以为 Android 等设置沉浸式模式 对于Maui项目 不需要再次在ContentPage中设置全屏 在 Android 中设置全屏也可以 您可以在 Maui 项目的 Main
  • iOS 模拟器上缺少语言

    当我运行我的应用程序时 我的 iPhone iPad 模拟器只提供 6 种语言选择 英语 德语 日语 意大利语 西班牙语和匈牙利语 在 Google 上搜索后 似乎应该至少有 18 种语言可供选择 我重新安装了 Xcode 4 3 1 并安
  • 切换到异步网络 API,例如 URLSession

    这是什么意思 我尝试了这个 仍然 它给了我同样的信息 DispatchQueue main async if let imageData try Data contentsOf url self image UIImage data ima