CSModuleSettings.h 2.45 KB
//
//  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\
}]