[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/ ...
随机推荐
- Navcat中Oracle连接的坑-Instant Client
报错信息: 官方下载Instant Client下载: http://www.oracle.com/technetwork/cn/topics/intel-macsoft-102027-zhs.htm ...
- exBSGS板子
/*bzoj2480*/ #include <map> #include <cmath> #include <cstdio> #include <cstrin ...
- Eclipse的Project Facets属性设置解决项目无故报错
新检出项目,发现代码无故报错,各种尝试,最终发现是因为 项目右键中的 project Facets 属性中的 java 后面的 version 版本和项目 build path 的 jdk 版本不一 ...
- HDU1540 区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU1507二分图
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- 旋转 3d
建议chorme浏览器浏览,有样式兼容性问题. 图片可以根据自己本地路径设置路径,js库引用jquery. 写的不好,多多建议,谢谢大家. <html onselectstart="r ...
- [Leetcode] LRU 算法实现
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- 【算法日记】2.算法中的大O符号
大O符号是一种算法复杂度的相对表示方式. 1.大O表示算法的操作数,表示出算法运行的快慢 2.大O表示法指出了最糟糕情况下的运行时间,例如 简单查找的运行时间O(n),意味着在最糟糕的情况下,必须运行 ...
- UVA 11105 Semi-prime H-numbers
https://vjudge.net/problem/UVA-11105 筛法 #include<cstdio> #include<cstring> #define N 100 ...
- dp,状压dp等 一些总结
也就作业几题而已,分析一下提醒 最重要的就是,记住,没用的状态无论怎么转移最后都会是没用的状态,所以每次转移以后的有值的状态都是有用的状态. 几种思考方向: 第一种:枚举当前的状态,转移成另外一个状态 ...