JLChen
2021-11-04 1443556e9ccb1a19ed8e6710c16c8adc4d4f4fb3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//
//  DHModuleManager.m
//  DHHive
//
//  Created by iblue on 2017/7/13.
//  Copyright © 2017年 jiangbin. All rights reserved.
//
 
#import "DHModuleManager.h"
#import <objc/runtime.h>
 
@interface DHModuleManager()
@property (nonatomic, strong) NSRecursiveLock *lock;
@property (nonatomic, strong) NSMutableArray <id<DHModuleProtocol>> *moduleArray;
@end
 
@implementation DHModuleManager
 
- (instancetype)init
{
    if (self = [super init]) {
        
    }
    return self;
}
 
+ (instancetype)sharedInstance
{
    static DHModuleManager *sharedInstance = nil;
    if (sharedInstance == nil) {
        sharedInstance = [[[self class] alloc] init];
    }
    return sharedInstance;
}
 
- (void)loadModuleByNameArray:(NSArray <NSString *> *)moduleArray
{
    for (NSString *moduleName in moduleArray)
    {
        Class moduelClass = NSClassFromString(moduleName);
        //如果没有这个模块 提示略过
        if (moduelClass == nil)
        {
            NSLog(@"找不到模块 %@", moduleName);
            continue;
        }
        
        //检测模块是否已经添加
        if ([self isModuleAdded:moduleName]) {
            NSLog(@"模块已经添加 %@", moduleName);
            continue;
        }
 
        //如果不遵从协议 则断言
        NSAssert(class_conformsToProtocol(moduelClass, @protocol(DHModuleProtocol)),@"模块:%@未遵守协议 IAppModule", moduleName);
        id<DHModuleProtocol> module = [[moduelClass alloc] init];
        [module moduleInit];
        NSLog(@"成功加载模块 %@", moduleName);
        [self.moduleArray addObject:module];
    }
}
    
- (void)deliveryCustomEvent:(NSString *)event userInfo:(NSDictionary *)userInfo
{
    for (id<DHModuleProtocol> module in self.modules) {
        if ([module respondsToSelector:@selector(moduleCustomEvent:userInfo:)]) {
            [module moduleCustomEvent:event userInfo:userInfo];
        }
    }
}
    
- (void)deliveryModule:(NSArray <NSString *> *)moduleArray customEvent:(NSString *)event userInfo:(NSDictionary *)userInfo
{
    if (moduleArray == nil) {
        [self deliveryCustomEvent:event userInfo:userInfo];
        return;
    }
    
    for (NSString *moduleName in moduleArray) {
        Class moduelClass = NSClassFromString(moduleName);
        for (id<DHModuleProtocol> module in self.modules) {
            if (![module isMemberOfClass:moduelClass]) {
                continue;
            }
            
            if ([module respondsToSelector:@selector(moduleCustomEvent:userInfo:)]) {
                [module moduleCustomEvent:event userInfo:userInfo];
            }
        }
    }
}
 
#pragma mark - Properties
- (NSMutableArray *)moduleArray
{
    if (_moduleArray == nil) {
        _moduleArray = [[NSMutableArray alloc] init];
    }
    
    return _moduleArray;
}
    
- (NSRecursiveLock *)lock
{
    if (!_lock) {
        _lock = [[NSRecursiveLock alloc] init];
    }
    return _lock;
}
 
- (NSArray *)modules
{
    [self.lock lock];
    NSArray *array = [self.moduleArray copy];
    [self.lock unlock];
    return array;
}
 
#pragma mark - Other
- (BOOL)isModuleAdded:(NSString *)moduleName
{
    Class moduelClass = NSClassFromString(moduleName);
    for (id<DHModuleProtocol> module in self.modules) {
        if ([module isMemberOfClass:moduelClass]) {
            return YES;
        }
    }
    
    return NO;
}
@end