iOS 学习笔记——0006(delegate与block)

来源:转载

delegate和block是什么?

delegate和block是iOS实现回调的两种机制

①delegate:

delegate:有道词典翻译为:代表;委托谁为代表。这里我暂且翻译为 委托 或者 代理 。

iOS中delegate的使用很多,如UITableView delegate 、UIPickerView delegate、UITextField delegate 等等

这里拿一个钟表引擎作为一个例子来讲:

首先,我们定义一个协议ClockEngineProtocol,这个协议提供一个方法,如下代码

@protocol ClockEngineProtocol <NSObject>-(void)currentTimeWithHour:(long)hour minute:(long)minute second:(long)second;@end

其次,我们定义一个钟表引擎类:

#import <Foundation/Foundation.h>#import "ClockEngineProtocol.h"@interface ClockEngine : [email protected](nonatomic,weak)id<ClockEngineProtocol> delegate;//这里使用weak的原因,请查看我的博文iOS 学习笔记——0004(@property详解) -(void)startWork; -(void)stopWork; @end #import "ClockEngine.h"@implementation ClockEngine{NSTimer* _timer;}-(void)startWork{_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fun) userInfo:nil repeats:true];}-(void)stopWork{[_timer invalidate];}-(void)fun{NSDate* now = [NSDate date];NSCalendar* calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];NSDateComponents* dateComponents = [calendar components:(NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond) fromDate:now];[_delegate currentTimeWithHour:dateComponents.hour minute:dateComponents.minute second:dateComponents.second];//获取当前时间}@end

在view视图中

-(void)currentTimeWithHour:(long)hour minute:(long)minute second:(long)second{_hourLable.text = [NSString stringWithFormat:@"%ld",hour];_minuteLable.text = [NSString stringWithFormat:@"%ld",minute];_secondLable.text = [NSString stringWithFormat:@"%ld",second];}- (void)viewDidLoad {[super viewDidLoad];ClockEngine* engine = [ClockEngine new];engine.delegate = self;[engine startWork];}

这样就通过代理的方式将当前时间的时分秒传到view视图上,同理我们也可以用代理的方式进行界面之间的传值,上面的这个例子比较经典所以这里展示这个

②block:

举例解释:

NSInteger (^resultOfAdd)(NSInteger,NSInteger);//定义block变量, resultOfAdd = ^(NSInteger num1,NSInteger num2)//对block变量进行赋值{ return num1 + num2;}; NSInteger num = resultOfAdd(10,20);//使用block变量NSLog(@"%ld",num);

上边的代码是一个简单的解释,下面举个实际中用的例子(使用block进行页面间的传值)

推酷上的一篇文章讲解写的很通俗,可以去看看

在比如我们使用GCD的时候

//GCD dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ _img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://news.cnr.cn/native/pic/20150917/W020150917252768563301.jpg"]]]; //注意在异步请求 dispatch_sync(dispatch_get_main_queue(), ^{ _imgView.image = _img;//主线程上的逻辑处理 }); });


分享给朋友:
您可能感兴趣的文章:
随机阅读: