[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/ ...
随机推荐
- css的存在形式及优先级
1. 查看源代码---在谷歌浏览器中右击-->点检查 2. CSS中style优先级,标签上的style优先,其它按照编写顺序越更新越优先,后面的会把前面的覆盖掉. 3. 如果想在其它的html ...
- CentOS 转义字符
常用转义字符 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串. 单引号(''):转义其中所有的变量为单纯的字符串. 双引号(""):保留其中的变量属性,不进行转义处理. 反引 ...
- caffe数据集——LMDB
LMDB介紹 Caffe使用LMDB來存放訓練/測試用的數據集,以及使用網絡提取出的feature(為了方便,以下還是統稱數據集).數據集的結構很簡單,就是大量的矩陣/向量數據平鋪開來.數據之間沒有什 ...
- [HNOI2010] 弹飞绵羊 (分块)
[HNOI2010] 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上 ...
- Maven命令行窗口指定settings.xml
maven命令行窗口指定特定settings.xml 在命令行界面指定settings.xml,命令如下: mvn install --settings c:\user\settings.xml 例如 ...
- AngularJs 中的CheckBox前后台交互
前台页面: <div class="form-group"> <label for="CompanyName" class="col ...
- 洛谷 P3709 大爷的字符串题
https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...
- LightOJ 1013 - Love Calculator LCS
题意:找一个串使给出的两个串都是它的子串,要求最短,求出最短长度,以及种类数. 思路:可以想到,当两个子串a,b拥有最长的公共子串为LCS时,那么可以求出的最短的串为lena+lenb-LCS. 那么 ...
- 「模板」「讲解」Treap名次树
Treap实现名次树 前言 学平衡树的过程可以说是相当艰难.浏览Blog的过程中看到大量指针版平衡树,不擅长指针操作的我已经接近崩溃.于是,我想着一定要写一篇非指针实现的Treap的Blog. 具体如 ...
- 「6月雅礼集训 2017 Day11」tree
[题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...