这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东。
委托和block是IOS上实现回调的两种机制。Block基本可以代替委托的功能,而且实现起来比较简洁,比较推荐能用block的地方不要用委托。
本篇的demo和前一篇是同一个,可以到github上下载不同的版本,
https://github.com/pony-maggie/DelegateDemo
A类(timeControl类)的头文件先要定义block,代码如下:
- //委托的协议定义
- @protocol
UpdateAlertDelegate - -
(void)updateAlert:(NSString *tltle); - @end
-
-
-
- @interface
TimerControl : NSObject - //委托变量定义
- @property
(nonatomic, weak) id delegate; -
-
- //block
- typedef
void (^UpdateAlertBlock)(NSString *tltle); - @property
(nonatomic, copy) UpdateAlertBlock updateAlertBlock; -
- -
(void) startTheTimer; -
- @end
A类的实现文件,原来用委托的地方改成调用block:
- -
(void) timerProc - {
-
//[self.delegate updateAlert:@"this is title"];//委托更新UI -
//block代替委托 -
if (self.updateAlertBlock) -
{ -
self.updateAlertBlock(@"this is title"); -
} - }
再来看看视图类,实现block即可:
- -
(void)viewDidLoad - {
-
[super viewDidLoad]; -
// Do any additional setup after loading the view, typically from a nib. -
TimerControl *timer = [[TimerControl alloc] init]; -
timer.delegate = self; //设置委托实例 -
-
//实现block -
timer.updateAlertBlock = ^(NSString *title) -
{ -
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:title message:@"时间到" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定",nil]; -
-
alert.alertViewStyle=UIAlertViewStyleDefault; -
[alert show]; -
}; -
-
-
-
[timer startTheTimer];//启动定时器,定时5触发 - }
//"被委托对象"实现协议声明的方法,由"委托对象"调用
- (void)updateAlert:(NSString *title)
{
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:title message:@"时间到" delegate:self cancelButtonTitle:nilotherButtonTitles:@"确定",nil]; alert.alertViewStyle=UIAlertViewStyleDefault; [alert show]; }