HomeVC.m
#import "HomeVC.h"
#import "ProtocolManager.h"
#import "AllProtocol.h"
@interface HomeVC ()<Home_Protocol>
@end
@implementation HomeVC
- (IBAction)btnAction:(id)sender {
Class cls = [[ProtocolManager sharedInstance] classForProtocol:@protocol(Mine_Protocol)];
UIViewController<Mine_Protocol> *mineVC = [[cls alloc] init];
[mineVC mine_Action:@{}];
[self presentViewController:mineVC animated:YES completion:nil];
}
// 在各个模块中实现其协议
+(void)load{
[[ProtocolManager sharedInstance] registerProtocol:@protocol(Home_Protocol) forClass:[self class]];
}
-(void)homea_Action:(NSString*)string{
}
@end
ProtocolManager.m
在ProtocolManager内维护着一张映射表,以protocol为key,以Class为Value
#import "ProtocolManager.h"
@interface ProtocolManager()
@property (nonatomic,strong) NSMutableDictionary *protocolCache;
@end
@implementation ProtocolManager
+ (instancetype)sharedInstance
{
static ProtocolManager *mediator;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mediator = [[ProtocolManager alloc] init];
});
return mediator;
}
-(NSMutableDictionary *)protocolCache{
if (!_protocolCache) {
_protocolCache = [NSMutableDictionary new];
}
return _protocolCache;
}
- (void)registerProtocol:(Protocol *)proto forClass:(Class)cls {
[self.protocolCache setObject:cls forKey:NSStringFromProtocol(proto)];
}
- (Class)classForProtocol:(Protocol *)proto {
return self.protocolCache[NSStringFromProtocol(proto)];
}
@end
上面一一对应的关系中,类是实现了对应的协议的。通过协议拿到的类是可以使用protocol中声明的方法。
AllProtocol.h
蘑菇街的protocal-class
将各个模块提供的协议统一放在一个文件中(AllProtocol.h),在各个模块中依赖这个文件,实现其协议
#import <Foundation/Foundation.h>
@protocol Home_Protocol <NSObject>
-(void)homea_Action:(NSString*)string;
@end
@protocol Mine_Protocol <NSObject>
-(void)mine_Action:(NSDictionary*)info;
@end
MineVC.m
#import "MineVC.h"
#import "AllProtocol.h"
#import "ProtocolManager.h"
@interface MineVC ()<Mine_Protocol>
@end
@implementation MineVC
+(void)load{
[[ProtocolManager sharedInstance] registerProtocol:@protocol(Mine_Protocol) forClass:[self class]];
}
- (void)mine_Action:(NSDictionary *)info {
}
@end