Objective-C 中的块真的有用吗?它们的效用是什么? [关闭]

2023-12-15

我刚刚读过有关块的内容,我了解到它们只是将信息封装为普通方法,但具有自己的强引用数据。我想知道块的好处是什么?


这是适用于我的项目的块的用途;替换代表和协议(在某些情况下)。

问题

假设您需要从服务器异步加载数据。您可能有一个方法需要 PUT 到路径(带有数据),然后最终在任务完成时将结果发送给方法调用者。

委托和协议解决方案

这是我们客户的方法签名,调用它AppClient:

- (void)putToPath:(NSString *)path withData:(id)data;

我们不能在该方法的返回中包含数据,因为它是异步的(意味着它不会等待任务完成来执行其他操作,例如运行下一行代码)。相反,我们构建一个协议:

@protocol AppClientRequestDelegate
- (void)appClient:(AppClient *)appClient didPutToPath:(NSString *)path withData:(id)sentData andReturnedData:(id)recievedData;
@end

那么你的AppClient类将创建一个如下所示的属性:

@property (weak, nonatomic)id<AppClientRequestDelegate> requestDelegate;

的来电者putToPath...方法将设置他的 AppClient 实例requestDelegate财产给self,并实现该方法,然后使用path and sentData参数,并用receivedData范围。

我们的调用者代码如下所示:

- (void)syncData:(id)data {
    [self.appClient putPath:@"/posts/9" withData:data];
}

- (void)appClient:(AppClient *)appClient didPutToPath:(NSString *)path withData:(id)sentData andReturnedData:(id)recievedData {
    if (/*path and sentData are right*/) {
        // Do something with recievedData
    }
}

这一切都很棒,但是当您向同一路径发出一堆 PUT 请求并尝试区分协议实现中的请求时,情况就很糟糕了。我想您可以向委托方法和putToPath...方法为每个请求指定一个 id,但这会很混乱且令人困惑。

另一个潜在的问题是您是否在整个应用程序中广泛使用异步加载;这可能会产生大量的代表和协议。

块解决方案

我们扩展我们的方法签名以包含一个块:

- (void)putToPath:(NSString *)path withData:(id)data completion:(void (^)(id returnedData))completion;

诚然,这种语法相当令人畏惧,但它不仅包含协议中的所有信息,而且允许方法的调用者将所有逻辑压缩到一个方法中,从而将该方法中调用的局部变量带入块的范围中。执行。

我们的调用者代码现在如下所示:

- (void)syncData:(id)data {
    [self.appClient putToPath:@"/posts/9" withData:data completion:^(id returnedData) {
        // Do something with returnedData
    }];
}

结论

你要求很好地使用块,我相信这是一个非常好的使用;它可能不适用于您,但您可以看到它不仅减少了代码量,而且还使其更具可读性和健壮性。

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

Objective-C 中的块真的有用吗?它们的效用是什么? [关闭] 的相关文章

  • UIWebView 中的后退/前进滑动手势?

    我的应用程序中有一个 WebView 因为它是一个选项卡式应用程序 所以我无法在网站上添加用于后退 前进的按钮 我想通过滑动来后退 前进 从左侧 边缘向右滑动又回来了 就像 iOS 版 Safari 浏览器一样 我该怎么做 我想我应该使用
  • 如果 [super init] 返回 nil 为什么不抛出异常?

    这被认为是典型的 id init self super init if self lt initializations gt return self 但选择这样的实际上能做出适当响应的东西不是更好吗 id init self super i
  • apple mach-o 链接器错误链接器命令失败,退出代码为 1(使用 -v 查看调用)

    2 https i stack imgur com pMAAm png我正在使用 Objective C 处理核心数据 出现错误 Apple Mach O Linker Error Linker command failed with ex
  • 使用 Java 创建 plist

    有没有一种简单的方法可以用Java创建plist 结果应该与 Objective C 中序列化字典相同 The PList http code google com p xmlwise source browse trunk src mai
  • 是否可以在 UITabBarController 内显示 SFSafariViewController?

    我要加载SFSafariViewController位于选项卡内部 因此选项卡栏位于整个 Safari 视图的底部 这可能吗 我尝试了这个但没有运气 self tabBarController presentViewController s
  • Objective-C 中的前向声明枚举

    我在 Objective C 程序中的枚举可见性方面遇到问题 我有两个头文件 其中一个定义了typedef enum 另一个文件需要使用typedef d type 在直C中 我会简单地 include另一个头文件 但在 Objective
  • 获取 iOS 5 中最后一个重定向的 url?

    有人可以发布最简单的工作代码 当我 GET 请求一个 url 时 它可以获取最后一个重定向的 url nth 吗 我知道我需要使用异步请求 但我无法制定出解决问题的完整工作代码 我正在使用 ios5 因此我可以使用 ios5 中最新添加的异
  • iOS 应用程序和.NET 应用程序之间的通信?

    我有 2 个应用程序 一个是 iOS 应用程序 一个是 NET 应用程序 我希望我的 iOS 应用程序发送一条消息 调用 NET 应用程序的方法 将一些字符串发送到 NET 应用程序以保存到数据库 那么 我的 iOS 应用程序如何与 NET
  • 如何制作字幕 UILabel / UITextField / NSTextField

    我需要制作字幕UILabel在 Xcode 中 选取框将从右向左滚动 我试过CCScrollingLabel also JHTickerView和别的 但我找不到带有选框的简单代码 没有任何视图 数组 一些愚蠢的库和其他库 如何制作选框UI
  • 如何在首选项包中使用 PSLinkListCell 中的值?

    我想为我的越狱调整制作一个偏好包 我成功地制作了一个带有可用开关的首选项捆绑包 但我想要一个选择颜色的设置 例子 Blue Color gt Yellow Green 所以如果我点击Color 它会将我带到另一个屏幕 要求我选择 Blue
  • 如何在 UICollectionView PerformBatchUpdates 块中排序移动、插入、删除和更新?

    In my UICollectionView 我使用一个简单的自定义对象数组来生成和显示单元格 有时数据会发生变化 我想一次性为所有变化添加动画效果 我选择通过跟踪第二个数组中的所有更改 比较两个数组并在一个数组内生成一组移动 插入 删除和
  • 从 iPhone 上的 NSString 中删除 HTML 标签

    有几种不同的方法可以删除HTML tags从一个NSString in Cocoa One way http cocoa karelia com Foundation Categories NSString Flatten a string
  • 外围 BLE 设备的唯一标识符

    所以我有外围设备BLE设备 我需要一些标识符以便稍后与另一部 iPhone 共享 我连接的示例iPhone A 为外围设备 iPhone A 将外围设备的标识符保存到数据库中 稍后我可以轻松获取iPhone B 并连接到通过该标识符找到的外
  • 更新到 Xcode 7.0.1,项目现在有问题

    因此 我将 Xcode 6 1 版本上传到 iTunes Connect 并且该应用程序获得了批准 现在我正在尝试更新应用程序 我更新到 Xcode 7 0 1 Xcode 给我带来了问题 指出 对于应用程序 我使用了故事板和 Object
  • 解析后 UITableView 委托和数据源在单独的类中

    我需要从一个单独的类设置 UITableView 委托和数据源 方法调用解析后数据准备就绪 但每次我的表都是空的 我正在使用 ARC 这是简化的代码 HomeViewController h import
  • NSMutableData 删除字节?

    我可以使用以下命令轻松地将字节添加到 NSMutableData 实例appendData方法 但是我没有看到任何类似的删除数据的方法 我是否忽略了某些内容 或者我是否需要创建一个新对象并仅复制我需要的字节 请参阅以下方法的文档 void
  • 使用捏合手势;如何放大用户手指实际“捏”的位置?

    我已经在我的应用程序中的 UIImageView 上实现了 UIPinchGestureRecognizer 但是无论我在图像的哪个位置捏合 它似乎都会放大到同一个位置 有谁知道我如何让它放大到用户实际 捏 的地方 请参阅下面的代码 视图控
  • UIAlertView 中的 MPVolumeView?

    是否可以将 MPVolumeView 放入 UIAlertView 中 我已经尝试过put它在里面 但不显示 这可能是sizeToFit or initWithFrame 部分 有没有办法测试是否MPVolumeView实际上正在被创建吗
  • iOS:addConstraints:应用程序崩溃

    Problem 我似乎无法在现有项目中采用自动布局 Details 我之前也遇到过与此问题相同的问题presentViewController 在 iOS 但所提供的答案都不是我的解决方案 我正在使用所有没有 xib 的故事板视图 我的 使
  • extern NSString *const 在类中。

    你好 我有这个头文件 import

随机推荐

  • 如何将核心动画块内的一段代码排除在动画之外?

    我有一个核心动画块 我在其中调用一个将加载视图控制器的方法 两个视图控制器之间发生自定义转换 然而 当视图控制器构建界面时 所有这些东西都会受到核心动画的影响 虽然它会产生一些有趣的效果 但我不希望这样 UIView beginAnimat
  • 在MongoDB中,如果一个索引有3个字段,那么我们在查询2个字段时可以使用该索引吗? (第三个字段的通配符)

    如果有一个索引 page type our id date 并且在查询时 db analytics find page type ingredients ga date gte new Date Wed Sep 08 2010 12 00
  • 如何在 .NET 运行时将文件夹添加到程序集搜索路径?

    我的 DLL 是由第三方应用程序加载的 我们无法对其进行自定义 我的程序集必须位于它们自己的文件夹中 我无法将它们放入 GAC 我的应用程序需要使用 XCOPY 进行部署 当根 DLL 尝试从另一个 DLL 同一文件夹中 加载资源或类型时
  • “倒置”边界半径可能吗? [复制]

    这个问题在这里已经有答案了 当我想到为我的链接制作选项卡 或选项卡 时 我正在研究我的网站的 CSS 我在这个例子中删除了文本 但这基本上是一个导航栏 这是图片 我的问题是 如何获得黑色箭头指向的 边框半径 效果 并且看起来像蓝色箭头指向的
  • 隐藏列时删除空格

    我在用贾斯珀报告 4 5 0生成报告 我正在生成不同格式的报告 如 html csv pdf xls doc 在我的一份报告中 我有 6 栏说第 1 列 第 2 列 第 3 列 第 4 列 第 5 列 第 6 列 但根据我想隐藏的条件col
  • 关闭 Sql Server/T-SQL 中的日志记录

    我需要关闭 Sql Server T SQL 中的日志记录才能写入 as400 中的文件 表 我发现你可以在 SQLite 中使用 Pragma 来做到这一点 然而 我发现T SQL 中不存在这种情况 有任何想法吗 Thanks 您需要禁用
  • 如何在 ios 中将 y-planar、u-planar 和 uv-planar 与 yuv bi planar 分开?

    在应用程序中我使用了 AVCaptureVideo 我得到了 kCVPixelFormatType 420YpCbCr8BiPlanarFullRange 格式的视频 现在我从图像缓冲区获取 y 平面和 uv 平面 CVPlanarPixe
  • 将位图转换为 WebP 图像?

    谁知道是否可以转换Bitmap to a WebP图像使用C 一直在 Google 搜索 但找不到 C 的任何内容 我找到了这个 mc kay libwebp sharp GitHub但它似乎没有将位图转换为WebP format 有任何想
  • 创建可重用的 jQuery 函数

    我没有每次都重新编写大量代码 而是尝试将函数合并到我的工作中 但我在使其工作时遇到了困难 基本上 我有一些单选按钮的选择 每次单击单选按钮时我都会执行一些操作 我实际上正在加载 iFrame 但是 我需要使每个单选按钮的 iFrame SR
  • WSL 2 真的支持 32 位程序吗?

    我用谷歌搜索了这个问题 一些答案声明 WSL 2 现在支持 ELF 32 程序 然而 在wsl2 Debian Ubuntu发行版上的简单测试没有通过 这是我的测试 install run time sudo dpkg add archit
  • 将 GridView 绑定到 IQueryable

    这个问题纯粹是学术性的 因为我从来没有梦想过这样做real code 使用 LINQ to SQL 我想绑定一个IQueryable
  • 防止 Chrome 中链接点击时光标发生变化

    单击 Chrome 而非 Safari 或 Firefox 中的链接会将光标从指针更改为箭头 这种行为可以预防吗 即 单击后是否仍然有指针 但光标仍悬停在链接上 编辑 好的 我做了更多测试 首先 任何人希望光标在单击链接后保持为指针的唯一原
  • 覆盖默认主题的自定义主题 WP7

    是否可以创建自定义主题并将其用作默认主题 我可以在任何地方找到的每个示例都说您可以通过复制来创建自定义主题ThemeResources xaml and System Windows xaml文件并将它们作为合并字典包含在您的应用程序中 h
  • Webpack 使用 Typescript 进行延迟加载

    我遇到了延迟加载和 webpack 的问题 Sean Larkin 的视频展示了使用 webpack 4 创建延迟加载包是多么容易 Here 但是当我尝试用打字稿来做时 我遇到了一些问题 index ts export const some
  • 比较不同表的数据行

    我发布了一个类似查询前一段时间 决定降低它的复杂性 让开发人员回答我的主要问题 它可以说是重复的 但我仍然想将其发布 因为编辑上一篇文章并没有产生太多结果 我有 2 个数据表 dataTable1 和 dataTable2 两者都有 1 行
  • 在 URL 中传递 base64 编码的字符串

    通过 GET 参数传递原始 Base64 编码字符串是否安全 还有其他 base64 规范 见表here了解具体情况 但本质上你需要 65 个字符来编码 26 个小写 26 个大写 10 个数字 62 您还需要两个 和一个填充字符 但它们都
  • CRM 2011:全局 JavaScript 和状态栏中的按钮

    我对 CRM 2011 不太陌生 但我面临一个大问题 我在网上找到了一些解决方案 可以在 CRM 中创建一些评分 排名系统 当我在顶部状态栏中 功能区按钮栏上方 屏幕右上角用户名旁边看到星星时 我完全困惑了 当我单击此按钮时 我会打开 di
  • Excel C# 将单元格转换为百分比

    我需要将双精度的单元格转换为百分比 我在 Excel 中使用宏 它说 Range B5 Select Selection Style Percent 当我在 C 中执行此操作时 它不起作用 Excel Range procentRange
  • 数据库休眠并引发异常

    当我一段时间没有进行任何数据库查询时 我认为它必须休眠 如果你随后调用它 则会抛出异常 java sql SQLNonTransientConnectionException Could not read resultset unexpec
  • Objective-C 中的块真的有用吗?它们的效用是什么? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我刚刚读过有关块的内容 我了解到它们只是将信息封装为普通方法 但具有自己的强引用数据 我想知道块的好处是什么 这是适用于我的项目的块的用途 替换代表和协议 在某些情况下 问题 假设您需