当计算使用后台线程时,如何正确声明计算属性?

2023-12-06

我试图声明一个由块组成的计算属性,在后台线程中执行。 因此,当我处理这个属性时,它是零,因为计算在未准备好时返回结果。如何更好地纠正这个问题?谢谢你!

enum Result<T> {
   case error(error: Error)
   case success(data: T)
}

var userID: Result<CKRecordID>? {

  var result: Result<CKRecordID>? = nil

  container.fetchUserRecordID { recordID, error in
    if let error = error { result = .error(error: error) }
    if let recordID = recordID { result = .success(data: recordID) }
  }

  return result
}

有一个直接的解决方案,例如使用 GCD 信号量。然而,整个方法一开始似乎并不正确,因为这可能会导致不必要的挂起,甚至在某些情况下死锁(例如在主线程中调用此属性)。更好的方法是将代码移动到具有适当完成处理程序的方法。

请记住,计算属性并不旨在取代方法。如果范围内有一些复杂(尤其是异步)计算,您几乎可以将该代码从属性移动到方法。

但不管怎么说:

var userID: Result<CKRecordID>? {

    var result: Result<CKRecordID>? = nil

    var sema = DispatchSemaphore(value: 0)

    container.fetchUserRecordID { recordID, error in
        if let error = error { result = .error(error: error) }
        if let recordID = recordID { result = .success(data: recordID) }

        sema.signal()
    }

    _ = sema.wait(timeout: .distantFuture)

    return result
}

这里有一个等待异步操作完成的 GCD 信号量。

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

当计算使用后台线程时,如何正确声明计算属性? 的相关文章

随机推荐

  • 未捕获的类型错误:无法读取 null 的属性“lastChild”

    h2 Matching Game h2 p Click on the EXTRA face on the left side p
  • 在没有 /bin/bash 命令的情况下运行 docker 容器

    我创建了 docker 容器 sudo docker run it ubuntu bin bash 在我读过的 码头工人书 一书中 只要我们指定的命令 bin bash 正在运行 容器就会运行 我不是用选项 it 创建了终端并且不需要 bi
  • 如何在 angularjs 单元测试中触发 mousemove 事件

    我已经实现了一个使用鼠标事件的 angularjs 指令 单击组件并上下移动鼠标可以更改值 所以我需要知道如何在单元测试中触发 mousemove 事件 我使用 karma jasmine 我想建议在单元测试中当鼠标向上或向下移动时测试此组
  • 如何圆化 Matplotlib 轴脊柱的连接

    这是一个相当简单的问题 我正在创建一个具有多个插入轴的 Matplotlib 图形 我已删除刻度线 以便每个插入轴的插入脊椎以 90 度角相交 但是 当您向该图窗添加图例时 它会添加一个图例对象 该图例对象的每个 边缘 都有稍微圆形的脊柱连
  • Java 中的特定方法有多少字节的字节码?

    我最近读到乔恩 正光的博客巨大的方法 8000 字节的字节码 不是使用 HotSpot 进行 JIT 编译的 所以我的问题是 作为程序员 如何找出特定方法有多少字节的字节码 JIT 编译器似乎当然知道 我可以从 class file 您可以
  • Git忽略目录和目录/*有什么区别?

    我对忽略 git 中目录内容的正确方法感到困惑 假设我有以下目录结构 my project www 1 txt 2 txt gitignore 放置这个有什么区别 www 和这个 www 我问这个问题的原因是 在 git 中 如果目录为空
  • 使用 RegEx 查找 VBA 注释

    我正在尝试使用正则表达式查找所有 VBA 注释 我有一些大部分有效的东西 但有一些例外我无法弄清楚 我正在使用的表达 拿我们的测试代码来说 Working This is a test This should be captured Wor
  • Python/Bokeh - 如何通过使用 Select、回调和 CustomJS/js_on_change 从 dict 中按列值过滤行来更改数据源

    问题应该出在回调函数上 不幸的是 我没有 JS 经验 我从 dataframe js 库中获取了这部分 但它不起作用 我们的想法是建立一个仪表板 其中包含费率 1 和费率 2 的两个图表以及两个费率类别的下拉菜单 import pandas
  • 如何在 HTML 网页中显示客户端计算机上的本地图像

    如何在网络服务器上托管的 HTML 网页中显示放置在客户端计算机上的本地图像 我放置的图像很少C Images文件夹所以路径应该是file C Images 1 jpg for a image 1 jpg 我正在使用代码 img src 在
  • excel vba冻结窗格而不选择

    我在 Excel 中有一个 VBA 脚本 可以冻结 Excel 工作表的窗格 但我很好奇是否可以在不先选择范围的情况下实现这一点 这是我当前的代码 它冻结了第 1 7 行 但使用Range Select ActiveSheet Range
  • 获取编辑元素的删除事件

    我正在尝试模拟 不存在的 更改事件contentEditable元素 但我猜这对于输入元素来说是同样的问题 不幸的是 当用户选择一些文本并从浏览器的上下文菜单中选择 删除 时 我不知道如何获取事件 有什么建议我可以如何得到它吗 修订后的答案
  • Python Regex - 在文本文件中的(多个)表达式之间提取文本

    我是一名 Python 初学者 如果您能帮助我解决文本提取问题 我将非常感激 我想提取文本文件中两个表达式之间的所有文本 字母的开头和结尾 对于两者 字母的开头和结尾都有多种可能的表达式 在列表 letter begin 和 letter
  • 如何在表格视图底部添加新行 - 聊天消息

    每次用户键入消息并单击 发送 时 我都会使用以下代码添加新消息 效果很好 但问题是 新消息被插入到表视图的顶部 我希望将其插入底部 import UIKit class ViewController UIViewController UIT
  • NServiceBus:指定消息顺序

    我在它自己的进程中使用 NServiceBus 所以not使用通用主机 我希望按特定顺序为一条消息提供多个消息处理程序 对于通用主机 您将实施ISpecifyMessageHandlerOrdering 但我不知道在托管您自己的 NServ
  • 使用 strut2 jquery 插件标签将 JSON 对象发送到 Struts 2 操作

    我们可以通过以下方式将 JSON 发送到 Struts2 操作json拦截器 有很好的样本http tech learnerandtutor com send json object to struts 2 action by jquery
  • 文件夹内容更改时重新启动 ASP.NET 应用程序

    我正在编写一个带有 插件 的网络应用程序 这些插件将是 DLL 文件 它将通过预定义的接口和东西导出其功能 所有 DLL 文件都位于名为 Plugins 的文件夹中 ASP NET 应用程序在启动时加载它们 通过使用 Assembly Lo
  • 带有文本的纹理,看起来像素化,如何在 unity3d 中解决这个问题?

    我使用 1024x1024 纹理 它映射到 Unity3d 中的四边形 目前的目标平台是 PC 独立平台 它看起来是这样的 您可以看到屏幕中的对象有多么像素化和模糊 如何才能使其更具可读性并减少像素化 导入设置 质量设置和关闭 mip ma
  • 读取/写入 Excel 2007 受密码保护的文档

    Office 2007 使用什么方法进行加密 当从 Office 菜单中选择 加密 并设置密码时 我的 C 应用程序需要创建和读取加密的 Excel 2007 文件 xlsx 重要的是这些文件仍然可以从 Excel 访问 因此我必须使用 M
  • 更改 BlobBuilder 中的文件名以作为 XHR 上的 FormData 传递

    我目前正在尝试将 ArrayBuffer 上传到服务器 我无法更改 该服务器需要我以多部分 表单数据格式上传的文件 服务器从Content Disposition部分的filename将被保存并在Content type提供文件时将使用的
  • 当计算使用后台线程时,如何正确声明计算属性?

    我试图声明一个由块组成的计算属性 在后台线程中执行 因此 当我处理这个属性时 它是零 因为计算在未准备好时返回结果 如何更好地纠正这个问题 谢谢你 enum Result