[New learn]讲解Objective-c的block知识-实践
1.简介
在之前的文章[New learn]讲解Objective-c的block知识中介绍了block的相关知识。本章中我们将以一个实际例子来简单介绍一下block如何代替代理。
2.原有通过代理实现方式回顾
在[How to] 使用Xib来创建view中我们介绍了如何通过xib来自定义table的footview,如何通过代理的方式来通知controller去加载更多数据。
相应的代码:https://github.com/xufeng79x/tableView_groupbuy_test
1.在上述项目中我们在XFLoadMoreView.h头文件中声明了一个协议
@protocol XFLoadMoreViewDelegate <NSObject> /** * 当按钮点击后通知代理实现对象 * * @param loadMoreView 触发者本身 */ @optional -(void) loadMoreViewDidClickedToLoadBtn:(XFLoadMoreView *) loadMoreView; @end
2.在自定义的XFLoadMoreView中声明了代理属性:
代理属性,指向显示了此代理的对象,防止循环引用需要使用weak属性参数 @property (nonatomic,weak) id<XFLoadMoreViewDelegate> delegate;
3.在controller中去实现了此协议,并在创建XFLoadMoreView实例的时候将其代理属性值设定为当前controller,以此来进行通知调用。
@interface XFGoodsShowsViewController () <UITableViewDataSource, XFLoadMoreViewDelegate>
。。。。。。。。。。。
// 加载按钮按下后通知到此对象调用此方法
-(void) loadMoreViewDidClickedToLoadBtn:(XFLoadMoreView *) loadMoreView
{
// 这里我们模拟增加一个团购的信息,插入到列表的最好一行
XFGoodModel *model = [[XFGoodModel alloc] init];
model.image = @"image.jpg";
model.name = @"new food";
model.price = ;
model.soldNum = ;
// 将次信息插入到表数据源中
[self.goodsList addObject:model];
// 需要将此数据塞入table的最后一行
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.goodsList.count - inSection:];\
[self.goodsTableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// 加载完毕后将table滚到新加入的行那里,也就是最后一条
[self.goodsTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
。。。。。。。
3.使用block特性来替代代理特性机制
我们可以不使用通过协议以代理的方式去做,我们可以通过block来处理:
具体方法为:
1.在XFLoadMoreView.h文件中声明block属性,用于接收来自目标的回调block
// 定义通知回调 @property(nonatomic,strong) void (^notifyLoadBlock)(XFLoadMoreView *);
2. 将XFLoadMoreView.m类初始化方法中增加block参数
// 利用block来进行通知回调的初始化方法
+(instancetype) loadMoreViewWithNotifyBlock:(void (^)(XFLoadMoreView *)) notifyLoadBlock
{
// 直接从xib中加载view
XFLoadMoreView *loadView = [[[NSBundle mainBundle] loadNibNamed:@"XFLoadButton" owner:nil options:nil] lastObject];
// 美化按钮,将按钮的四个角圆润化
loadView.loadMoreBtnView.layer.cornerRadius = ;
loadView.loadMoreBtnView.layer.masksToBounds = YES;
// 设定加载更多回调block
loadView.notifyLoadBlock = notifyLoadBlock;
return loadView;
}
3.在controller处初始化XFLoadMoreView的时候将具体block实现传入:
// 加载tableView的footview
XFLoadMoreView *loadMoreView = [XFLoadMoreView loadMoreViewWithNotifyBlock:^(XFLoadMoreView * view){
[self loadMoreViewDidClickedToLoadBtn:view];
}];
这里重复利用了原有协议方式中的方法。
4.当自定义XFLoadMoreView中发生加载事件的时候去通知controller加载数据:
/**
* 点击加载更多按钮后触发
*/
- (IBAction)loadMoreClick {
// 将botton隐藏让后将加载样式呈现
self.loadMoreBtnView.hidden = YES;
self.loadMoreIngView.hidden = NO;
// 使用此方法能够达到延迟执行效果
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
self.loadMoreBtnView.hidden = NO;
self.loadMoreIngView.hidden = YES;
// 向代理发送信息,由于是代理定义中设置的是可选方法,所以发送信息之前需要检查是否实现了此方法
// if ([self.delegate respondsToSelector:@selector(loadMoreViewDidClickedToLoadBtn:)])
// {
// [self.delegate loadMoreViewDidClickedToLoadBtn:self];
// }
// 使用回调进行加载通知
if (nil != self.notifyLoadBlock)
{
self.notifyLoadBlock(self);
}
});
4.总结
在本文中我们将一个原本通过代理的方式实现的功能通过block方式实现。
那么何时应该采用代理何时应该采用block呢?
我们可以参考如下文章:http://stackoverflow.com/questions/26791548/objc-memory-usage-of-delegate-vs-block
本章代码:https://github.com/xufeng79x/BlockDemo
[New learn]讲解Objective-c的block知识-实践的更多相关文章
- <CEPH中国-深圳站-技术交流会演讲PPT> YY云平台Ceph Block应用实践 & 我写的书 《CEPH实战》
YY云平台Ceph Block应用实践 http://s3.yyclouds.com/public/YY%E4%BA%91%E5%B9%B3%E5%8F%B0Ceph%E5%AE%9E%E8%B7%B ...
- T型知识实践结构的力量(转载)
最近在做的一些新的事情,这其中获得的一些新的思考. T型的知识积累,深度的挖掘可以通过"举一反三"的应用在广度上,广度可以通过"交叉验证"加强我们的认识,可以说 ...
- [New learn]讲解Objective-c的block知识
1.简介 OC的Block感觉就是C中饿函数指针,提供回调功能,但是OC中的block比C的函数指针要更加强大,甚至可以访问本地变量和修改本地变量. block在oc中是一个对象,它可以像一般的对象那 ...
- block知识总结
一.block在内存中存在的形式 1.当把block句法写在函数或者方法外面时,系统会在静态数据区分配一块内存区域给block对象.这片区域在程序执行期会一直存在. 2.当block句法写在函数或者方 ...
- inode与block知识总结
inode概述:硬盘要分区,然后格式化,创建文件系统在每个Linux存储设备的分区被格式化为ext3文件系统后一般有两个部分: 第一部分Inode:存储这些数据的属性信息(大小,属主,归属的用户 ...
- Magento的布局(Layout),块(Block)和模板(Template)
public function indexAction() { //remove our previous echo //echo 'Hello Index!'; $this->loadLayo ...
- 转载一篇比较详细的讲解html,css的一篇文章,很长
转载自这里,转载请注明出处. DIV+CSS系统学习笔记回顾 第一部分 HTML 第一章 职业规划和前景 职业方向规划定位: web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 ...
- @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
- 指向函数的指针与iOS-Block相关知识
指向函数的指针与iOS-Block相关知识 一. 函数指针的定义和调用: 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/ ...
随机推荐
- Socket网络编程实例1
Socket: 对所有上层协议(TCP/IP,UDP等)的底层封装. 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(so ...
- 【倍增】LCM QUERY
给一个序列,每次给一个长度l,问长度为l的区间中lcm最小的. 题解:因为ai<60,所以以某个点为左端点的区间的lcm只有最多60种的情况,而且相同的lcm区间的连续的. 所以就想到一个n*6 ...
- 如何提升集群资源利用率? 阿里容器调度系统Sigma 深入解析
阿里妹导读:为了保证系统的在线交易服务顺利运转,最初几年,阿里都是在双11大促来临之前大量采购机器储备计算资源,导致了双11之后资源大量闲置点现象.是否能把计算任务与在线服务进行混合部署,在现有弹性资 ...
- Vue项目搭建过程
环境搭建:mac+nodejs+npm #安装node.js : $ brew install node #安装vue-cil: $ npm install -g vue-cli 注:官网下载安装no ...
- 四连测Day2
题目:链接: https://pan.baidu.com/s/1ef_9hGBhczW0B4dz5IUKmw 密码: qgjy T1: hash后直接二分查询即可 #include<iostre ...
- 使用C#解析并运行JavaScript代码
如果想在C#编程中解析并运行JavaScript代码,常见的方式有两种: 利用COM组件“Microsoft Script Control”,可参见:C#使用技巧之调用JS脚本方法一 利用JScrip ...
- mysql语句进阶
1.null mysql> create table worker(id int not null,name varchar(8) not null,pass varchar(20) not n ...
- linux 常见服务端口
Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daemons) 来执行的.守护进 ...
- ADS 安装失败后在此安装在Modify Repair Remove界面循环问题解决
估计是因为Win7和ADS不兼容的原因,第一次安装ADS后一直停在100%的位置,等了好久也没有反应.于是我点了Cancel.准备从新安装,于是就发生了下面的问题:一直在Modify Repair R ...
- Codeforces Round #407 (Div. 2) D,E
图论 D. Weird journey time limit per test 2 seconds memory limit per test 256 megabytes input standard ...