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.用观察者实现回调
[[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];//得到了要播放的音乐名称
}