[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/ ...
随机推荐
- Docker的结构(6-13)
一.Docker的结构. Docker命令不清楚的时候可以在命令的最后加上--help Docker和虚拟机的区别? 虚拟机的实现原理是:先模拟出一套硬件,然后在这基础上跑一个操作系统,然后在这个操作 ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- POJ3469:Dual Core CPU——题解
http://poj.org/problem?id=3469 题目大意: 两个CPU,处理每个任务有不同的代价,有些对任务如果不在同一个CPU就会增加代价,求最小代价. ——————————————— ...
- BZOJ3435 & 洛谷3920 & UOJ55:[WC2014]紫荆花之恋
https://www.lydsy.com/JudgeOnline/problem.php?id=3435 https://www.luogu.org/problemnew/show/P3920 ht ...
- BZOJ3572:[HNOI2014]世界树——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- 洛谷2219:[HAOI2007]修筑绿化带——题解
https://www.luogu.org/problemnew/show/P2219#sub 为了增添公园的景致,现在需要在公园中修筑一个花坛,同时在画坛四周修建一片绿化带,让花坛被绿化带围起来. ...
- PHP检测json格式数据
首先要记住json_encode返回的是字符串, 而json_decode返回的是对象 判断数据不是JSON格式: 复制代码代码如下: function is_not_json($str){ ...
- 背景建模技术(六):帧处理(FrameProcessor)模块
前面几篇文章简单介绍了BgsLibrary的入口函数.视频分析和视频捕获模块,本文将简单介绍帧处理模块,即对每一帧进行处理的函数,也就是真正调用背景建模算法的接口处. 下面贴出源码供大家分析: #in ...
- hzwer分块九题(暂时持续更新)
hzwer分块9题 分块1:区间加法,单点查询 Code #include<bits/stdc++.h> #define in(i) (i=read()) using namespace ...
- 【链表】在O(1)的时间删除链表的节点
/** * 在O(1)的时间删除链表的节点 * * @author * */ public class Solution { public static void deleteNode(Node he ...