CSModuleSettings.h
2.45 KB
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
//
// CocoaModuleSettings.h
// CocoaSettings
//
// Created by Yunpeng Li on 2018/4/19.
// Copyright © 2018年 Baidu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <BBAFoundation/BBAFoundation.h>
//#if __has_include("extobjc.h")
#define CSReset(CLASS, PROPERTY) [CLASS resetValueForKey: @keypath([CLASS standard], PROPERTY)]
#define CSRemoveValue(SETTINGS, PROPERTY) [SETTINGS removeValueForKey: @keypath(SETTINGS, PROPERTY)]
#define CSObserve(CLASS, KEYPATH) [[CLASS standard] observeKeyPath:@keypath([CLASS standard], KEYPATH) source:self]
//#else
//#define CSReset(SETTINGS, PROPERTY)
//#define CSObserve(CLASS, KEYPATH)
//#endif
@interface CSSubscriber: NSObject
- (void)setTarget:(id)target action:(SEL)action;
- (void)didSet:(id)block;
@end
@interface CSModuleSettings : NSObject
@property (nonatomic, strong, readonly) NSString *layerIdentifier;
/// 获取标准模式的Settings,读取
+ (instancetype)standard;
/// 获取特定DataLayer下的Settings
+ (instancetype)defaults;
+ (instancetype)modified;
/// 将值重置为默认值
+ (void)resetValueForKey:(NSString *)key;
/// 移除当前模式下的值(标准模式下无效)
- (void)removeValueForKey:(NSString *)key;
#pragma mark - 供子类覆盖
/// 初始化默认值(供子类覆盖,切勿手动调用)
- (void)setupDefaultValues;
/// 设置需要自更新的属性(供子类覆盖,切勿手动调用)
- (void)setupSelfUpdate;
/// 自定义缓存路径
+ (NSString *)customCachePath;
/// 持久化为单独文件(如果customCachePath不为nil,则始终返回YES)
+ (BOOL)isIndividualPersistence;
/// 如果有改动,则进行持久化
- (void)synchronizeIfNeeded;
#pragma mark - SelfUpdate
+ (void)registerSelfUpdateKeyPath:(NSString *)keyPath params:(NSDictionary *)params;
#pragma mark - Observer
- (CSSubscriber *)observeKeyPath:(NSString *)keyPath source:(id)source;
- (void)removeObserverForTarget:(id)target selector:(SEL)selector;
- (void)removeAllObserverForKeyPath:(NSString *)keyPath;
- (void)removeAllObserversForTarget:(id)target;
@end
// 自更新部分,不建议直接使用,各单独Layer使用时应当定义自己的宏方便业务方使用
extern NSString * const kCSSelfUpdateKeyExtra;
extern NSString * const kCSSelfUpdateKeyLayerIdentifier;
#define _CSSelfUpdate(KeyPath, LayerIdentifier, Extra) \
[[self class] registerSelfUpdateKeyPath:KeyPath params: @{ \
kCSSelfUpdateKeyLayerIdentifier: LayerIdentifier,\
kCSSelfUpdateKeyExtra: Extra\
}]