iOS中利用委托和观察者模式实现变量回调和方法回调

                                  iOS中利用委托和观察者模式实现变量回调和方法回调

    当前一种先发生的情况有一些属性或行为依赖与后一种后发生的情况时,这时候就需要实现回调,例如:在ios手机移动开发中,一个视图控制页面是控制音乐播放的页面,另一个页面是音乐的资源库,一般音乐播放器都是先加载音乐播放界面,然后再进入资源库选择音乐回到音乐播放界面进行播放,音乐播放界面播放音乐依赖于从后加载的音乐资源库界面选择音乐,这种情况下就需要回调,回调选择的音乐名到音乐播放界面中,但是在ios开发中,我们知道两个视图控制界面的控制不在同一个文件中进行控制,这样就有一定的麻烦,实现将选择的音乐名进行直接回调就有一定的难度了,所以在这种情况下可以选择观察者和委托模式进行回调。如下图:


在音乐播放中包含着两个视图控制器playViewController和sourceViewController,playViewController中有一个属性selectName需要从sourceViewController中获取,从而实现音乐播放。

1.委托实现回调

    用委托建立回调首先应声明一个协议,用协议中的方法获取回调。例如:

声明一个协议在playViewController.h文件中,然后再声明一个采用此协议的属性id<getSelectName>delegate,如下:

@protocol getSelectName <NSObject>

- (NSString *)getSelectName;

@end

@interface LIPlayViewController : UIViewController

......

@property (assign,nonatomic)id<getSelectName> delegate;

......

@end

在LISourceViewController.h文件中,让sourceViewController采用协议getSelectName,如下:

#import "LIPlayViewController.h"

@interface LISourceViewController: UIViewController<getSelectName>

......

......

@end

然后在.m文件中实现协议的- (NSString *)getSelectName 方法,从而返回选择的音乐名,最后是在LIPlayViewController.m文件中,在执行进入资源库的方法中添加当前实例的委托为要呈现的资源库控制器的示例。在viewWillAppear方法中通过执行[self.delegate getSelectName]得到选择的音乐资源名。

2.用观察者实现回调

  首先 LISourceViewController.m的返回音乐播放界面的函数中封装通知并将通知发往通知中心

[[NSNotificationCenter defaultCenter] postNotificationName:@"selectName" object:selectName];

然后在LIPlayViewController.m文件中的ViewAppear方法中设置当前self为观察者,

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getSelectName:) name:@"selectName" object:nil];

通过方法

- (void)getSelectName:(NSNotification *)notification{

   NSString * selectName=(NSString *)[notification object];//得到了要播放的音乐名称

}

   和委托比起来,用观察者实现回调更简单方便一些,同时也可以用观察者模式来获得群发的回调,可以回调行为或者变量,行为通过block来实现,这一点委托非常受限制。 在进行回调时要明确从哪回调到哪一个地方,回调的源头是被委托对象或者是通知者(即是封装通知的),回调的目的地是委托方或观察者。



   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值