CocoaSettings.h 3.59 KB
//
//  CocoaSettings.h
//  CocoaSettings
//
//  Created by Yunpeng Li on 2018/4/19.
//  Copyright © 2018年 Baidu. All rights reserved.
//

#import <UIKit/UIKit.h>

//! Project version number for CocoaSettings.
FOUNDATION_EXPORT double CocoaSettingsVersionNumber;

//! Project version string for CocoaSettings.
FOUNDATION_EXPORT const unsigned char CocoaSettingsVersionString[];

#import <CocoaSettings/CSDataLayer.h>
#import <CocoaSettings/CSModuleSettings.h>
#import <CocoaSettings/CSDataLayer.h>

@class BDPKVManager;

#define AliasSettings(Protocol, Selector) \
@protocol Protocol; \
@protocol CSSettings_##Protocol \
@property (class, nonatomic, strong, readonly) id<Protocol> Selector; \
@end \
@interface CSSettings(Protocol)<CSSettings_##Protocol> \
@end

#define registerSettings(SettingsClass) [[CocoaSettings sharedInstance] registerSettings: [SettingsClass class]]
#define registerPublicSettings(Protocol, SettingsClass) [[CocoaSettings sharedInstance] registerPublicSettings:@protocol(Protocol) implClass:[SettingsClass class]]
#define registerPublicSettingsWithAlias(Protocol, SettingsClass, Alias) \
do {\
[[CocoaSettings sharedInstance] registerPublicSettings:@protocol(Protocol) implClass:[SettingsClass class]]; \
[[CocoaSettings sharedInstance] registerAlias:@selector(Alias) forPublicSettings:@protocol(Protocol)]; \
} while(0)

/// 专门用于不同模块间的分发调用
@interface CSSettings: NSObject
@end

@interface CSDefaultSettings: CSSettings
@end

@interface CSModifiedSettings: CSSettings
@end


/// 标准层没有具体的值,其通过顺序查询各层直至取回值
extern NSString * const kCSDataLayerIdentifierStandard;

/// 默认提供两层 默认层、改动层
extern NSString * const kCSDataLayerIdentifierDefault;
extern NSString * const kCSDataLayerIdentifierModified;

/// CocoaSettings持久化文件的后缀: .settings
extern NSString * const kCSFileExtension;

/// 创建KV组件时使用的唯一ID
extern NSString * const kCSKVId;
extern NSString * const kCSModuleSettingsIdentifierABTest;
extern NSString * const kCSKVValueSuffix;

@interface CocoaSettings : NSObject
@property (nonatomic, copy, readonly) NSArray<CSDataLayer *> *layers;
@property (nonatomic, copy, readonly) NSArray<Class> *registeredSettingsClasses;
@property (nonatomic, copy, readonly) NSString *defaultCachePath;
@property (nonatomic, assign) BOOL finishStageTTI; // TTI阶段是否完成
@property (nonatomic, assign) BOOL isFirstOrUpdateInstall; // 是否是首次或覆盖安装,默认为正常启动
@property (nonatomic, copy) NSString *conveniencePrefix;
+ (instancetype)sharedInstance;


#pragma mark - 创建Settings实例相关
- (CSModuleSettings *)settingsForClass:(Class)settingsClass layerIdentifier:(NSString *)layer;

#pragma mark - 注册相关
- (void)registerSettings:(Class)settingsClass;
- (void)registerPublicSettings:(Protocol *)protocol implClass:(Class)implClass;
- (void)registerAlias:(SEL)selector forPublicSettings:(Protocol *)protocol;

#pragma mark - DataLayer相关
- (CSDataLayer *)layerForIdentifier:(NSString *)identifier;
- (void)registerLayer:(CSDataLayer *)layer invokeSettings:(Class)invokeSettings;

#pragma mark - 持久化相关
- (void)loadDataIfNeededForSettings:(Class)settingsClass;

/// 如果有改动,则立即进行持久化
- (void)synchronizeIfNeeded;
- (void)synchronizeForSettingsIfNeeded:(Class)settingsClass;

/// 在下一个runloop执行synchronizeIfNeeded(用于避免导入数据时,同一时间内大量读写)
- (void)setNeedsSynchronize;

///获取启动阶段默认层耗时
- (NSDictionary *)getDefaultSettingTimeCost;

///获取KVManager
- (BDPKVManager *)getKVManager;

@end