Objective C 委托还是 C 风格的块回调?

2024-01-14

我正在设计一个类,每当有事情发生时就会“触发事件”。这些事件往往与 UI 无关。我想知道这样做的最佳方法是什么。我一直在探索:

代表们

我将定义一个委托类,在 init 函数中接受委托,并在事件发生时调用委托类上的方法。

C型块

我将定义一个函数指针,并在 init 函数中接受一个函数。当事件发生时我会调用它。

在这两种情况下,我可能需要处理多个“源”,因此我需要一组委托或块。

我注意到,在 iOS 编程中,委托往往是首选,尤其是 UI 框架。但我有函数式编程背景,我非常乐意接受函数点并在调用站点传递 lambda,而且我喜欢编译器为您处理提升变量,并且您通常需要较少的类状态。但我发现很多 iOS 开发人员都在使用委托。

iOS 中通常首选的机制是什么?


各有各的用处。

当有多个“事件”需要通知委托时和/或类需要从委托获取数据时,应使用委托。一个很好的例子是UITableView.

当只有一个(或两个)事件时最好使用块。完成块(也可能是失败块)就是一个很好的例子。一个很好的例子是NSURLConnection sendAsynchronousRequest:queue:completionHandler:.

第三个选项是通知。当事件中可能有多个(且未知)相关方时,最好使用此方法。其他两项仅在有一个(且已知)感兴趣方时才有用。

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

Objective C 委托还是 C 风格的块回调? 的相关文章

  • 应用程序未通过协同设计验证?

    我在提交 iPhone 申请时遇到问题 我看到了一些类似的问题 但没有找到答案 当我存档项目并单击 验证 时 收到错误消息 应用程序未通过协同设计验证 签名无效 或者未使用 Apple 提交证书进行签名 我假设我在协同设计部分做错了什么 我
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 如何通过辅助功能 API 获取当前所选文本的全局屏幕坐标。

    我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD CTRL D 时显示所选文本的以下弹出对话框 我想实施 我的可可应用程序具有相同的功能 我的应用程序将在后台运行 并显示有关所选文本的一些热键的建议 我已经实现了热键捕获 我只需要
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 为什么这个 SKPhysicsJointPin 不能将这 2 个精灵保持在一起?

    我显然不太了解 SKPhysicsJoint 但是除了 Apple 文档之外 网上的信息还很少 下面的代码有什么问题 我认为应该保持头部和颈部永久连接 我的意图是它们就像两张带有大头针的纸 这样它们可以旋转一点 但不仅仅是完全分开 当我运行
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • 向jetty添加多个资源目录

    希望在 Jetty 中使用多个静态目录 当服务器运行时 http localhost 8282 A http localhost 8282 B http localhost 8282 C A 置于 X V A 中 B 置于 Q Z B 中
  • Cloud Run 是否需要 NGINX?

    我正在为我的博客和工作网站使用 Cloud Run 我真的很喜欢它 我已经根据 google 教程通过容器化部署了 python API 和 Vue Nuxt 应用程序 我不明白的一件事是为什么前面不需要 NGINX Use the off
  • 如何在Python中打印一个数字n次? [复制]

    这个问题在这里已经有答案了 如何在Python中打印一个数字n次 我可以像这样打印 A 5 次 print A 5 AAAAA 但不是 10 个 像这样 print 10 5 50 我想要的答案是10 10 10 10 10 我如何逃避数学
  • 将文件附加到存档而不读取/重写整个存档

    我有很多文件想要存储在一个存档文件中 我的第一个方法是将文件存储在压缩的 tarball 中 问题是 如果添加单个文件 我必须重写整个存档 我可以摆脱 gzip 压缩 但添加文件仍然很昂贵 您建议使用哪种其他存档格式来允许快速追加操作 Th
  • Laravel 迁移 - 创建时间戳时出现问题

    我正在尝试在我的 Laravel 实例上运行迁移 它们只是默认迁移 用户和密码重置 但是当它尝试创建时间戳时 它会抛出此错误 Illuminate Database QueryException SQLSTATE 42000 Syntax
  • 正则表达式中的可选字符

    任务非常简单 但我还没有想出一个好的解决方案 字符串可以包含数字 破折号和加号 或者仅包含数字 0 9 做了我需要的大部分工作 除了当用户输入像 这样的垃圾时 我在常规前瞻方面运气不佳 因为破折号和加号可能位于字符串中的任何位置 有效字符串
  • 来自 QDataStream 的 QT QString

    我正在使用缓冲区 并试图从中获取字符串 但不起作用 Example void myFunc QDataStream in quint8 v in gt gt v Ok I caught v value successfuly QString
  • 如何通过 grunt-contrib-uglify 按顺序缩小 js 文件?

    我有一个如下所示的目录 文件夹 b js 文件夹 jQuery js 文件夹 a js 文件夹 sub c js 我想将所有这些js文件缩小到一个js文件中in order jQuery js gt a js gt b js gt c js
  • VBA 多个循环匹配条件

    如果这是重复的 我深表歉意 因为我一直在搜索但没有找到答案 我对 VBA 以及它们如何构造循环很陌生 我正在尝试进行搜索和比较 我需要比较第一行中的值 看看它们是否与第二行匹配 如果不匹配 则继续移动到下一行 请参阅下面的我的代码 它运行时
  • 集群上运行的 Dask 程序出现文件未找到错误

    我有 4 台机器 M1 M2 M3 和 M4 调度程序 客户端 工作线程都在 M1 上运行 我已将 csv 文件放入 M1 中 其余的机器都是工人 当我在 dask 中使用 read csv 文件运行程序时 它给我错误 找不到文件 当您的一
  • 如何运行新的 gradle 任务?

    我在 build gradle 中创建了一个新的 gradle 任务 task callCL type Exec println hello commandLine rerun sh 假设运行 rerun sh bin bash cucum
  • 无法在 Windows 8 Metro 风格应用程序中使用 IPAddress 或类似类型

    我发现使用有困难System Net IPAddress或 Windows 8 Metro 应用程序中的任何类似类型 我正在创建一个将在 Intranet 环境中运行的应用程序 用户将使用 IPAddress 连接到远程服务器 但不知何故我
  • 如何调试复杂的 IF Excel 公式?

    我是一名学校老师 正在开发学校的评估系统 我应该怎么做才能纠正这个公式 IF H3 SUR IF Subject C3 lt 2 7 Not on track IF Subject C3 lt 3 29 On track IF Subjec
  • 卡夫卡消费者错误:标记协调员死亡

    我有一个在 Kafka 0 10 0 1 集群中有 10 个分区的主题 我有一个生成多个消费者线程的应用程序 对于这个主题 我生成了 5 个线程 我在我的应用程序日志中多次看到此条目 INFO AbstractCoordinator 600
  • Cython cimport 找不到 .pxd 模块

    已解决 请参阅编辑 3 假设包的结构如下 Some Package some package init py core init py definition pxd helper init py helper pxd helper pyx
  • 如何发送带有 header 参数的 HTTP 请求?

    一般来说 我对 javascript 和网络编程非常陌生 我需要一些帮助 我有一个 HTTP 请求 需要通过 javascript 发送 并需要将输出存储在变量中 我尝试仅使用呼叫网址 https api fantasydata net n
  • OpenXML SpreadsheetDocument SaveAs() 给出文件使用中错误

    我正在尝试使用从 ASP Net Core Web 应用程序调用的 OpenXMLPowerTools v4 5 3 2 DocumentFormat OpenXML v2 9 1 动态生成 Excel 电子表格 我已经验证能够正常生成电子
  • std::thread,在“this”上启动线程(从类本身内部)

    我正在尝试创建一个类 该类启动其成员方法之一的线程实例 当我在 main 中执行操作时 test myinstance std thread mythread myinstance 然后事情编译 但使用以下结构 include
  • 在 Android 上创建类似 iPhone 的徽章通知

    ALL 我到处都能看到有关如何使其适用于应用程序图标的回复 我的情况有点不同 在我的程序中 我有一个显示图像的 ListView 每个图像都与下面的对象相关联 我想做的是创建一个类似于 iPhone 徽章通知的设计 但适用于视图中的所有图像
  • Objective C 委托还是 C 风格的块回调?

    我正在设计一个类 每当有事情发生时就会 触发事件 这些事件往往与 UI 无关 我想知道这样做的最佳方法是什么 我一直在探索 代表们 我将定义一个委托类 在 init 函数中接受委托 并在事件发生时调用委托类上的方法 C型块 我将定义一个函数