IPhuanLib
iPhuan Open Source
Install / Use
/learn @iPhuan/IPhuanLibREADME
<a name="iPhuanLib">iPhuanLib</a>
iPhuanLib是本人在平时的开发过程中知识积累后整理出来的一套可直接用于开发的框架,包含了平时自己写的一些基础类,工具类,视图控件,以及基于别人的代码修改优化后的类库等。用意在于跟大家一起分享自己在平时工作中所摸索的技术和成果,同时也方便一些开发者可以直接基于iPhuanLib来快速启动项目。
目前集成在iPhuanLib里的类并不多,日后会不断更新资源并跟进优化,当前iPhuanLib已发布1.0.1版本,提供了完整demo,并且提供Pod库支持,方便开发者下载使用。
目录
<br /> <br /><a name="GetiPhuanLib">如何获取iPhuanLib</a>
- 如果你想使用完整版的iPhuanLib,添加以下命令行到Podfile:
pod 'iPhuanLib'
- 如果你想使用iPhuanLib部分模块,可分模块添加:
pod 'iPhuanLib/Foundation'
pod 'iPhuanLib/Utils'
pod 'iPhuanLib/Additions'
pod 'iPhuanLib/Additions/UIKit'
pod 'iPhuanLib/Views'
pod 'iPhuanLib/Views/IPHHorizontalTableView'
pod 'iPhuanLib/Views/IPHConditionSelectorView'
pod 'iPhuanLib/Others'
<br />
<a name="Introduce">介绍说明</a>
<br /><a name="Foundation">Foundation</a>
Foundation为基础类库目录,一般来说整个iPhuanLib的类都依赖于Foundation基础库。
<a name="IPHDebug">IPHDebug</a>
IPHDebug方便开发者在Debug模式下进行项目调试和相关信息的打印。
IPHLog,Debug模式下用来打印log;IPH_PRINT_METHOD_NAME,Debug模式下打印函数名;IPH_CONDITION_PRINT,Debug模式下根据一定的条件来打印log;
<a name="IPHCommonMacros">IPHCommonMacros</a>
IPHCommonMacros为一些常用的宏定义命令,为开发者在编写代码时提供便捷。
IPHCommonMacros包含了一些单列类的宏定义,几何宏定义,条件判断宏定义等等,直接查看IPHCommonMacros.h文件便可一目了然。
<a name="IPHBaseModel">IPHBaseModel</a>
IPHBaseModel为基础模型类,主要方便开发者可直接通过数据字典对对象进行初始化。与大家平常使用的主流的基础模型类不同的是,IPHBaseModel做了更大的改进和优化,IPHBaseModel不仅可以直接对字符串的属性进行映射初始化,还能对对象属性,数组属性进行映射,类似于响应链的模式可进行多级的数据处理和初始化。
开发者需要继承于IPHBaseModel来进行使用,以下是对各个API做的相关说明:
A类属性说明:
<br />
- 1、如果一个对象的属性为IPHBaseModel的子类,或者遵循IPHBaseModelProtocal协议,在本文档中称为A类属性;
- 2、如果一个对象的属性为数组类型,且该数组中所有的元素都为1中所提的A类属性,则该属性也被称为A类属性。
- (NSDictionary *)attributeMapDictionary;
对象属性映射字典。开发者在子类中重写该方法,并返回一个可用的字典。其中字典的Key为属性的名称,Value为方法
initWithDictionary:中字典参数的Key,通过该映射方法,IPHBaseModel在初始化对象时才知道怎么从数据字典中取值并进行初始化。
假设Json数据中root为一个酒店信息字典,包含了name,hotle_id,recommended_room,room_list等字段,其中recommended_room对应于一个推荐房间的字典,包含了房间的各个信息,room_list为一个数组,数组里面也是房间的字典,我们首先建立了一个叫IPHRoom的对象用来接收房间的信息,再建立一个IPHHotle的对象用来接收整个酒店的信息,IPHRoom和IPHHotle都继承于IPHBaseModel,于是我们可以在IPHHotle对象的attributeMapDictionary方法中这么写:
- (NSDictionary*)attributeMapDictionary{
return @{@"hotleName":@"name",
@"hotleId":@"hotle_id",
@"recommendedRoom":@"recommended_room",
@"rooms":@"room_list",
@"address":@"address"};
}
Key都为
IPHHotle的属性名称,Value则为Json数据中对应的字段,通过该映射IPHBaseModel则自动给对应属性赋值。
- (NSDictionary *)attributeDefaultValueMapDictionary;
属性默认值的映射。当属性的值在初始化后为nil时,通过该映射可以对属性设定默认值。代码示例:
- (NSDictionary*)attributeTypesMapDictionary{
return @{@"address":@"地址未知"};
}
- (NSArray<NSString *> *)filterStrings;
需要过滤的字段。当属性在初始化数据后,如果值为
filterStrings数组里面的某个过滤字符串时,该属性会自动被设置为nil。目前过滤的字符串如下:
- (NSArray *)filterStrings{
// 当值为以下字符串时直接设为nil
return @[@"NIL", @"Nil", @"nil", @"NULL", @"Null", @"null", @"(NULL)", @"(Null)", @"(null)", @"<NULL>", @"<Null>", @"<null>"];
}
子类可重写该方法返回自己需要过滤的字符串。filterStrings的作用在于屏蔽掉一些从服务器获取的数据中包含空字符串的问题。
- (NSDictionary *)attributeTypesMapDictionary;
A类属性其对应数据的类型映射。在
attributeMapDictionary方法的介绍中,我们有提到Json数据中recommended_room和room_list对应于字典和数组数据,相应的IPHHotle对象中,recommendedRoom对应于IPHRoom对象,rooms为一个数组,数组中的元素都为IPHRoom对象,那么IPHBaseModel在给IPHHotle初始化的时候怎么就能将单纯的字典和数组数据,转化为符合要求的对象数据呢,此时attributeTypesMapDictionary就起了至关重要的作用。如以下代码示例:
- (NSDictionary*)attributeTypesMapDictionary{
return @{@"recommendedRoom":@"IPHRoom",
@"rooms":@"IPHRoom"};
}
我们在映射中指定了
recommendedRoom和rooms属性其数据类型为IPHRoom对象,通过该映射IPHBaseModel才能对二级数据进行处理,否则只能直接赋值没有经过处理的字典和数组数据。
同理,在
IPHRoom中我们同样可以拥有A类属性,通过这种响应链方式的映射关系,一级一级的将数据初始化下去。
当然该映射你也可以不重写返回空字典,然后自己手动对
recommended_room和room_list字段的数据进行特殊处理。IPHBaseModel在初始化数据的时候调用了属性的Set方法,所以你只需要重写set方法,代码示例:
- (void)setRooms:(NSArray *)rooms{
id obj = nil;
if ([rooms isKindOfClass:[NSArray class]] && rooms.count > 0) {
obj = rooms[0];
}
// 如果rooms元素的类型为字典则手动进行数据处理
if ([obj isKindOfClass:[NSDictionary class]]) {
NSMutableArray *roomList = [[NSMutableArray alloc] initWithCapacity:rooms.count];
for (NSDictionary *roomDic in rooms) {
IPHRoom *room = [[IPHRoom alloc] initWithDictionary:roomDic];
// 特殊数据处理
room.hotel = self;
[roomList addObject:room];
}
_rooms = [[NSArray alloc] initWithArray:roomList];
return;
}
// 如果rooms元素已经为IPHRoom对象,则直接赋值
_rooms = rooms;
}
一般建议通过
attributeTypesMapDictionary映射的方式让IPHBaseModel自动处理数据,除非你对数据的处理有特别要求,比如代码示例,需要单独再给数组中的IPHRoom对象设定hotel,此时可以进行手动处理。
1.0.1版本对于数据的特殊处理做了很好的优化,详细用法请参考handleAttributeValue:forAttributeName:。 IPHBaseModel目前只支持对A类属性进行数据再次处理,这两种类型已基本满足大部分开发者的需求。
<a name="handleAttributeValue"></a>
- (__kindof IPHBaseModel *)handleAttributeValue:(__kindof IPHBaseModel *)object forAttributeName:(NSString *)attributeName;
对应于
attributeTypesMapDictionary,1.0.1新增方法,为了方便解决特殊数据处理问题。当IPHBaseModel通过attributeTypesMapDictionary映射将对应字典转化为A类属性值之后,会调用该方法,将对象传递过来允许开发人员在该方法中对该对象数据进行二次处理,处理完后IPHBaseModel才将最终的值赋给A类属性。object即为传递过来的对象,通过attributeName可判断对应于哪个A类属性。如setRooms:示例中的特殊处理可以通过handleAttributeValue:forAttributeName:方法快速实现:
- (__kindof IPHBaseModel *)handleAttributeValue:(__kindof IPHBaseModel *)object forAttributeName:(NSString *)attributeName {
if ([@"rooms" isEqualToString:attributeName]) {
IPHRoom *room = object;
room.hotel = self;
return room;
}
return object;
}
<a name="setup"></a>
- (void)setup;
IPHBaseModel通过initWithDictionary:初始化对象后会调用该方法,开发者可在该方法中进行相关初始化操作。代码示例:
- (void)setup {
// 在setup进行其他初始化操作
self.country = @"美国";
}
- (instancetype)initWithDictionary:(NSDictionary *)dictionary;
通过一个字典对对象进行初始化。注意,
initWithDictionary:只对attributeMapDictionary中映射的属性进行初始化。其他属性在通过该方法初始化后值依然为nil。
- (NSDictionary *)toDictionary;
与
initWithDictionary:对应,反向将对象转化为字典。如果对象的属性为A类属性则可继续进行字典转化。
- (NSData *)archivedData;
<br />获取适用于存档的Data数据,注意,存档时先调用该方法获取Data数据,再通过
[NSUserDefaults standardUserDefaults]的setObject:forKey:方法存档。NSUserDefaults本身不支持自定义对象的存储。
:warning:注意:
IPHBaseModel会将Number类型的字典数据转化为字符串,你在使用IPHBaseModel创建类时,其对应的属性应当以字符串的形式创建。
<a name="IPHBaseModelProtocal">IPHBaseModelProtocal</a>
1.0.1版本新增协议类,1.0.0时IPHBaseModel基础模型是通过继承来实现,为了便于开发者对对象进行扩展,现提供协议的方式来实现基础模型。
对象需遵循IPHBaseModelProtocal协议并结合NSObject+IPHBaseModel分类一起使用来达到IPHBaseModel实现的效果。IPHBaseModelProtocal协议方法就不需要再详细介绍,和IPHBaseModel中对应的方法使用一致,具体对NSObject+IPHBaseModel分类的方法进行说明。
- (instancetype)initWithIphDictionary:(nullable NSDictionary *)dictionary;
在使用上和
IPHBaseModel一致,需要注意的是只有遵循IPHBaseModelProtocal协议的对象,才可以通过该方法正常初始化。
- (nullable NSDictionary *)iph_toDictionary;
将一个遵循
IPHBaseModelProtocal协议的对象反向转化为字典。如果对象不遵循IPHBaseModelProtocal协议,则直接返回nil;如果对象的属性为A类属性则可继续进行字典转化。
- (nullable NSString *)iph_description;
通过
iph_toDictionary方法转化为字典,并输出该字典的UTF-8的description,开发者可在对象中重写description方法,并调用iph_description,如:
- (NSString *)description {
return [self iph_description];
}
- (id)iph_copyWithZone:(NSZone *)zone;
提供
copyWithZone:批量处理方法,如你希望某个对象遵循NSCopying协议,可调用该方法来进行快速处理,如:
- (id)copyWithZone:(NSZone *)zone {
return [self iph_copyWithZone:zone];
}
- (void)iph_decodeWithCoder:(NSCoder *)decoder;- (void)iph_encodeWithCoder:(NSCoder *)encoder;
提供
initWithCoder:和encodeWithCoder:批量处理方法,如你希望某个对象遵循NSCoding协议,可调用该方法来进行快速处理,如:
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
[self iph_decodeWithCoder:aDecoder];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[self
