iOS高级理论:Block的应用

Block 是 Objective-C 和 Swift 中的一种语言特性,可以用来封装一段代码并在需要时执行。在 iOS 开发中,Block 被广泛应用于以下场景:

一、异步任务处理

Block 可以用于异步任务的处理,例如网络请求、文件读写等。通过在 Block 中定义任务和回调,可以简化异步代码的编写。

// 异步网络请求示例
[NSURLSession.sharedSession dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {if (error) {NSLog(@"Error: %@", error.localizedDescription);} else {// 处理网络请求结果}
}];

二、动态回调

Block 可以作为回调函数传递,用于在某个操作完成后执行特定的代码。这种方式常用于处理用户交互、动画效果等。

// 动态回调示例
[UIView animateWithDuration:0.3 animations:^{// 执行动画效果
} completion:^(BOOL finished) {if (finished) {// 动画完成后执行的代码}
}];

三、事件处理

Block 可以用于处理用户事件,例如按钮点击事件、手势识别等。通过给控件设置 Block 回调,可以简化事件处理的逻辑。

// 按钮点击事件处理示例
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:@"Click Me" forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside];// Block 回调处理按钮点击事件
button.tapAction = ^{NSLog(@"Button tapped");
};

具体案例:

场景:UIViewContoller有个UITableView并是它的代理,通过UITableView加载CellView。现在需要监听CellView中的某个按钮(可以通过tag值区分),并作出响应。

// 激活事件 #pragma mark - 按钮点击事件 
- (IBAction)btnClickedAction:(UIButton *)sender { if (self.btnClickedBlock) {           self.btnClickedBlock(sender);}
}

随后,在ViewController.m的适当位置(- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{…代理方法)中通过setter方法设置CellView的Block属性。Block写着当按钮被点击后要执行的逻辑。

// 响应事件 
cell.btnClickedBlock = ^(UIButton *sender) { //标记消息已读 [weakSelf requestToReadedMessageWithTag:sender.tag]; //刷新当前cell [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
};

其实,即使Block不传递任何参数,也可以传递事件的。但这种情况,无法区分事件的激活方(cell里面的哪一个按钮?)。即:

//按钮点击Block @property (nonatomic, copy) void (^btnClickedBlock)(void);
// 激活事件 #pragma mark - 按钮点击事件 
- (IBAction)btnClickedAction:(UIButton *)sender { if (self.btnClickedBlock) { self.btnClickedBlock();}
}
// 响应事件 
cell.btnClickedBlock = ^{ //标记消息已读 [weakSelf requestToReadedMessageWithTag:nil]; //刷新当前cell [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
};

四、数据传递

Block 可以用于传递数据或者操作,例如在界面之间传值或者执行某些操作后返回结果。

// 数据传递示例
[self presentViewController:secondViewController animated:YES completion:^{secondViewController.completionBlock = ^(BOOL success) {if (success) {NSLog(@"Data transfer successful");}};
}];

具体案例:

场景:上面的响应事件,其实也是传递数据,只是它传递的对象是UIButton。如下所示,SubTableView是VC的一个属性和子视图。

4.1 传递数值
SubTableView.h@property (strong, nonatomic) void (^handleDidSelectedItem)(int indexPath);
SubTableView.m- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{[tableView deselectRowAtIndexPath:indexPath animated:YES];_handleDidSelectedItem ? _handleDidSelectedItem(indexPath) : NULL;
}
VC.m[_subView setHandleDidSelectedItem:^(int indexPath) {[weakself handleLabelDidSearchTableSelectedItem:indexPath];
}];- (void)handleLabelDidSearchTableSelectedItem:(int )indexPath { if (indexPath==0) {[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"telprompt:%@", self.searchNullView.telLabel.text]]];}else if (indexPath==1){[self.navigationController popViewControllerAnimated:YES];}
}
4.2 传递对象

例如HYBNetworking网络框架中请求成功时传递接口返回数据对象的Block:

[HYBNetworking postWithUrl:kSearchProblem refreshCache:NO params:params success:^(id response) {          typeof(weakSelf) strongSelf = weakSelf; //[KVNProgress dismiss]; NSString *stringData = [response mj_JSONString];stringData = [DES3Util decrypt:stringData]; NSLog(@"stirngData: %@", stringData);...
}

总的来说,iOS 中的 Block 是一种非常灵活和强大的工具,可以简化代码逻辑、实现回调机制、处理异步任务等。合理地使用 Block 可以提高代码的可读性和可维护性,同时也能更好地适应 iOS 开发中的各种需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基础复习(IDA调试器)

1.选择IDA调试后端 在顶部有一个下拉菜单,选择调试器后端位置 很多用户实际上使用的是Windows版本的IDA,该IDA可以直接调试Windows下32bit和64bit的程序 2.本地调试启动方法 载入IDA后,程序实际上在对程序内置的一个字符串进行base64解码…

ARM Cortex-X5 传言表现不佳,高功率浪涌和低多核分数影响即将推出的核心设计

ARM 的新 Cortex-X5 设计似乎遇到了问题,有新的传言称,超级核心在提高时钟速度时会经历严重的高功耗,并且当最大功率限制降低时,多核性能会下降。虽然这对高通来说可能不是问题,因为据说其 Snapdragon 8 Gen 4 采用定制…

第四套CCF信息学奥赛c++ CSP-J认证初级组 中小学信奥赛入门组初赛考前模拟冲刺题(阅读程序题)

第四套中小学信息学奥赛CSP-J考前冲刺题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围&#xff0c;判断题正确填√错误填X;除特殊说明外&#xff0c;判断题 1.5分&#xff0c;选择题3分&#xff0c;共计40分) 第一题 归并排序 1 #include <iostream> 2 usi…

力扣--哈希表/滑动窗口/双指针3.无重复字符的最长子串

思路分析&#xff1a; 使用双指针 i 和 j 表示子串的起始位置和结束位置。遍历字符串 s&#xff0c;对于每个字符&#xff1a; 如果字符不在 hash 中&#xff0c;将其加入 hash&#xff0c;同时更新最长子串的长度 result。如果字符已经在 hash 中&#xff0c;说明有重复字符出…

HeadFirst读书笔记

一、设计模式入门 1、使用模式最好的方式“把模式装进脑子里&#xff0c;然后在你的设计和已有的应用中&#xff0c;寻找何处可以使用它们”。以往是代码复用&#xff0c;现在是经验复用。 2、软件开发的一个不变的真理就是变化。 二、设计原则 1、找出应用中可能需要变化之…

unity发布webGL压缩方式的gzip,使用nginx作为web服务器时的配置文件

unity发布webGL压缩方式的gzip&#xff0c;使用nginx作为web服务器时的配置文件 Unity版本是&#xff1a;2021.3 nginx的版本是&#xff1a;nginx-1.25.4 Unity发布webgl时的测试 设置压缩方式是gzip nginx配置文件 worker_processes 1;events {worker_connections 102…

MATLAB练习题:计算动物能存活的天数的期望值

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 假设自然界中有一种动物&#xff0c;它每天被天敌捕食的概率均…

如何移除禁用WordPress默认小工具(附WordPress默认小工具名称)

WordPress 自带的小工具非常多&#xff0c;但是我们用到的也就那么几种&#xff0c;甚至一种都不会用到&#xff0c;所以很有必要注销&#xff08;去除&#xff09;掉一些不用的小工具。实现的方法也很简单&#xff0c;只需将以下代码&#xff0c;根据自己的情况删除需要用的小…

Pyglet综合应用|推箱子游戏地图编辑器之图片跟随鼠标

目录 推箱子游戏 升级一&#xff1a;鼠标操作 升级二&#xff1a;增加网格 升级三&#xff1a;模拟按钮 综合应用&#xff1a;地图编辑器 关卡地图洗数 推箱子游戏 本篇为之前写的博客《Pyglet综合应用&#xff5c;推箱子游戏之关卡图片载入内存》的续篇&#xff0c;内容…

MCU多核异构通信原理

摘要&#xff1a; 本文结合瑞萨RZ/G2L 多核处理器&#xff0c;给大家讲述一下多核异构设计及通信的原理。 随着电子技术的不断发展&#xff0c;以及市场需求的日益增长&#xff0c;嵌入式系统不仅要求执行复杂的控制任务&#xff0c;还需要实时地采集和处理数据。 为了满足这…

精品基于springboot的线上辅导班系统的开发与设计-课程报名

《[含文档PPT源码等]精品基于springboot的线上辅导班系统的开发与设计[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#…

Linux命令-chkconfig命令(检查或设置系统的各种服务)

说明 chkconfig命令 检查、设置系统的各种服务。这是Red Hat公司遵循GPL规则所开发的程序&#xff0c;它可查 询操作系统在每一个执行等级中会执行哪些系统服务&#xff0c;其中包括各类常驻服务。谨记chkconfig不是立 即自动禁止或激活一个服务&#xff0c;它只是简单的改变了…

再探二分法

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读二分查找题目思路解法左闭右闭式写法左闭右开式写法 二分查找 题目 给定一个…

程序人生:不积跬步无以致千里

程序人生 癸卯年冬月&#xff0c;往渭南韩城&#xff0c;拜访司马迁祠。入门攀爬而上&#xff0c;至人有困乏之时&#xff0c;抬头现&#xff1a;高山仰止。归路下山&#xff0c;始现三官洞&#xff0c;遥想西汉时三官洞&#xff0c;出口处刻意再拜别&#xff1a;高山仰止。泪…

数学结构和智能结构

集合结构、代数结构、拓扑结构和人工智能结构都是数学中研究的不同的数学结构。它们之间的关系可以从以下几个方面来看&#xff1a;集合结构是最基本的数学结构&#xff0c;研究的是元素之间的关系。集合可以包含不同的元素&#xff0c;其关系可以通过集合的交、并、差等操作进…

面向面试的机器学习知识点(4)——分类模型

省流版&#xff1a; 本文介绍机器学习中的回归算法&#xff1a;逻辑回归、KNN、SVM、随机森林和XGBoost。作为机器学习的有监督学习方法&#xff0c;分类模型是最重要也是最常见的一类算法&#xff0c;在数据分析等岗位的笔试面试中都是常客&#xff0c;非常值得深入研究&…

自定义神经网络四之编写自定义神经网络

文章目录 前言神经网络组件代码整体的项目结构Tensor张量Layers层NeuralNet神经网络Loss损失函数Optim优化器data数据处理train训练 神经网络解决实际问题实际问题训练和推理代码 总结 前言 自定义神经网络一之Tensor和神经网络 自定义神经网络二之模型训练推理 自定义神经网络…

基于容器和集群技术的数据自动化采集设计和实现

目标&#xff1a;部署mysql服务容器并使用docker构建包含python爬虫脚本的容器采集数据到mysql数据库。 环境&#xff1a;Centos7、已配置Kubernetes集群及docker。 环境配置请参考以下文章&#xff1a; CentOS7搭建Kubernetes集群 Kubernetes集群信息如下(虚拟机主机名和IP…

Mysql整理-概述

Mysql概述 MySQL是一种流行的开源关系数据库管理系统(RDBMS),它使用结构化查询语言(SQL)来访问、管理和处理数据。它是基于客户端-服务器模型的数据库,意味着数据存储在服务器上,而用户可以通过客户端软件从不同的位置访问这些数据。 MySQL的主要特点包括: 开源软件:M…

Linux安装Mysql设置自启动失败,bugFailed to execute operation: No such file or directory

bug: [rootlocalhost mysql-5.7]# systemctl enable mysql.service Failed to execute operation: No such file or directory 出现bug原因&#xff1a; ①CentOS7的服务systemctl脚本存放在&#xff1a;/usr/lib/systemd/&#xff0c;有系统&#xff08;system&#xff09;和…