Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

支持对CoreData关系的映射和序列化,支持对映射和序列化的单独配置 #337

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
4 changes: 3 additions & 1 deletion MJExtension/MJExtension.h
Expand Up @@ -12,4 +12,6 @@
#import "NSObject+MJClass.h"
#import "NSObject+MJKeyValue.h"
#import "NSString+MJExtension.h"
#import "MJExtensionConst.h"
#import "MJExtensionConst.h"
#import "NSManagedObject+MJCoreData.h"

4 changes: 4 additions & 0 deletions MJExtension/MJFoundation.h
Expand Up @@ -10,4 +10,8 @@

@interface MJFoundation : NSObject
+ (BOOL)isClassFromFoundation:(Class)c;
/**
* 是否是容器,NSArray, NSSet, NSOrderSet
*/
+ (BOOL)isCollectionClass:(Class)c;
@end
29 changes: 28 additions & 1 deletion MJExtension/MJFoundation.m
Expand Up @@ -11,6 +11,7 @@
#import <CoreData/CoreData.h>

static NSSet *foundationClasses_;
static NSSet *collectionClasses_;

@implementation MJFoundation

Expand All @@ -27,11 +28,26 @@ + (NSSet *)foundationClasses
[NSArray class],
[NSDictionary class],
[NSString class],
[NSAttributedString class], nil];
[NSAttributedString class],
[NSSet class],
[NSOrderedSet class],
nil];
}
return foundationClasses_;
}

+ (NSSet *)collectionClass
{
if (collectionClasses_ == nil) {
collectionClasses_ = [NSSet setWithObjects:
[NSSet class],
[NSArray class],
[NSOrderedSet class],
nil];
}
return collectionClasses_;
}

+ (BOOL)isClassFromFoundation:(Class)c
{
if (c == [NSObject class] || c == [NSManagedObject class]) return YES;
Expand All @@ -45,4 +61,15 @@ + (BOOL)isClassFromFoundation:(Class)c
}];
return result;
}

+ (BOOL)isCollectionClass:(Class)c {
__block BOOL result = NO;
[[self collectionClass] enumerateObjectsUsingBlock:^(Class collectionClass, BOOL * _Nonnull stop) {
if ([c isSubclassOfClass:collectionClass]) {
result = YES;
*stop = YES;
}
}];
return result;
}
@end
33 changes: 33 additions & 0 deletions MJExtension/NSManagedObject+MJCoreData.h
@@ -0,0 +1,33 @@
//
// NSManagedObject+MJCoreData.h
// MJExtensionExample
//
// Created by 陆晖 on 15/10/30.
// Copyright © 2015年 陆晖. All rights reserved.
//

#import <CoreData/CoreData.h>
#import "NSObject+MJKeyValue.h"

/** 这个数组中的属性名将会作为唯一键值判断,如果所有键值都存在且相等,则从数据获取数据进行更新 */
typedef NSArray * (^MJIdentityPropertyNames)();

@protocol MJCoreDataKeyValue <MJKeyValue>

@optional
/**
* CoreData里的unique key,映射之前,先通过unique key去查找对应的data,如果存在,则更新,不存在,则新建
*/
+ (NSMutableArray *)mj_identityPropertyNames;

@end

@interface NSManagedObject (MJCoreData)<MJCoreDataKeyValue>

/**
* CoreData里的unique key,映射之前,先通过unique key去查找对应的data,如果存在,则更新,不存在,则新建
*/
+ (void)mj_setupIdentityPropertyNames:(MJIdentityPropertyNames)ientityPropertyNames;
+ (NSMutableArray *)mj_totalIdentityPropertyNames;

@end
30 changes: 30 additions & 0 deletions MJExtension/NSManagedObject+MJCoreData.m
@@ -0,0 +1,30 @@
//
// NSManagedObject+MJCoreData.m
// MJExtensionExample
//
// Created by 陆晖 on 15/10/30.
// Copyright © 2015年 陆晖. All rights reserved.
//

#import "NSManagedObject+MJCoreData.h"
#import "NSObject+MJClass.h"

@interface NSObject (MJClassPrivate)

+ (NSMutableArray *)mj_totalObjectsWithSelector:(SEL)selector key:(const char *)key;

@end

static const char MJCoreDataIdentityKey = '\0';

@implementation NSManagedObject (MJCoreData)

+ (void)mj_setupIdentityPropertyNames:(MJIdentityPropertyNames)ientityPropertyNames {
[self mj_setupBlockReturnValue:ientityPropertyNames key:&MJCoreDataIdentityKey];
}

+ (NSMutableArray *)mj_totalIdentityPropertyNames {
return [self mj_totalObjectsWithSelector:@selector(mj_identityPropertyNames) key:&MJCoreDataIdentityKey];
}

@end
56 changes: 56 additions & 0 deletions MJExtension/NSObject+MJClass.h
Expand Up @@ -23,6 +23,16 @@ typedef NSArray * (^MJIgnoredPropertyNames)();
/** 这个数组中的属性名将会被忽略:不进行归档 */
typedef NSArray * (^MJIgnoredCodingPropertyNames)();

/** 这个数组中的属性名才会进行JSON序列化 */
typedef NSArray * (^MJJSONSerializationPropertyNames)();
/** 这个数组中的属性名才会序列化到object中 */
typedef NSArray * (^MJObjectMappingPropertyNames)();

/** 这个数组中的属性名会被忽略:不会进行JSON序列化 */
typedef NSArray * (^MJIgnoredJSONSerializationPropertyNames)();
/** 这个数组中的属性名会被忽略:才会序列化到object中 */
typedef NSArray * (^MJIgnoredObjectMappingPropertyNames)();

/**
* 类相关的扩展
*/
Expand Down Expand Up @@ -85,6 +95,52 @@ typedef NSArray * (^MJIgnoredCodingPropertyNames)();
*/
+ (NSMutableArray *)mj_totalIgnoredCodingPropertyNames;

#pragma mark - 序列化映射白名单配置
/**
* 这个数组中的属性名才会进行JSON序列化
*
* @param ignoredCodingPropertyNames 这个数组中的属性名将会被忽略:不进行归档
*/
+ (void)mj_setupJSONSerializationPropertyNames:(MJJSONSerializationPropertyNames)jsonSerializationPropertyNames;

/**
* 这个数组中的属性名将会被忽略:不进行归档
*/
+ (NSMutableArray *)mj_totalJSONSerializationPropertyNames;
/**
* 这个数组中的属性名才会序列化到object中
*
* @param ignoredCodingPropertyNames 这个数组中的属性名将会被忽略:不进行归档
*/
+ (void)mj_setupObjectMappingPropertyNames:(MJObjectMappingPropertyNames)objectMappingPropertyNames;

/**
* 这个数组中的属性名才会序列化到object中
*/
+ (NSMutableArray *)mj_totalObjectMappingPropertyNames;

#pragma mark - 序列化黑名单配置

/**
* 这个数组中的属性名会被忽略:不会序列化到object中
*/
+ (void)mj_setupIgnoreObjectMappingPropertyNames:(MJIgnoredObjectMappingPropertyNames)ignoredObjectMappingPropertyNames;

/**
* 这个数组中的属性名会被忽略:不会序列化到object中
*/
+ (NSMutableArray *)mj_totalIgnoredObjectMappingPropertyNames;

/*
* 这个数组中的属性名会被忽略:不会进行JSON序列化
*/
+ (void)mj_setupIgnoredJSONSerializationPropertyNames:(MJIgnoredJSONSerializationPropertyNames)ignoredJSONSerializationPropertyNames;

/*
* 这个数组中的属性名会被忽略:不会进行JSON序列化
*/
+ (NSMutableArray *)mj_totalIgnoredJSONSerializationPropertyNames;

#pragma mark - 内部使用
+ (void)mj_setupBlockReturnValue:(id (^)())block key:(const char *)key;
@end
40 changes: 40 additions & 0 deletions MJExtension/NSObject+MJClass.m
Expand Up @@ -16,6 +16,10 @@
static const char MJIgnoredPropertyNamesKey = '\0';
static const char MJAllowedCodingPropertyNamesKey = '\0';
static const char MJIgnoredCodingPropertyNamesKey = '\0';
static const char MJJSONSerializationPropertyNamesKey = '\0';
static const char MJObjectMappingPropertyNamesKey = '\0';
static const char MJIgnoredJSONSerializationPropertyNamesKey = '\0';
static const char MJIgnoredObjectMappingPropertyNamesKey = '\0';

static NSMutableDictionary *allowedPropertyNamesDict_;
static NSMutableDictionary *ignoredPropertyNamesDict_;
Expand Down Expand Up @@ -128,6 +132,42 @@ + (NSMutableArray *)mj_totalAllowedCodingPropertyNames
{
return [self mj_totalObjectsWithSelector:@selector(mj_allowedCodingPropertyNames) key:&MJAllowedCodingPropertyNamesKey];
}

#pragma mark - 序列化白名单配置
+ (void)mj_setupJSONSerializationPropertyNames:(MJJSONSerializationPropertyNames)jsonSerializationPropertyNames {
[self mj_setupBlockReturnValue:jsonSerializationPropertyNames key:&MJJSONSerializationPropertyNamesKey];
}

+ (NSMutableArray *)mj_totalJSONSerializationPropertyNames {
return [self mj_totalObjectsWithSelector:@selector(mj_jsonSerializationPropertyNames) key:&MJJSONSerializationPropertyNamesKey];
}

+ (void)mj_setupObjectMappingPropertyNames:(MJJSONSerializationPropertyNames)objectMappingPropertyNames {
[self mj_setupBlockReturnValue:objectMappingPropertyNames key:&MJObjectMappingPropertyNamesKey];
}

+ (NSMutableArray *)mj_totalObjectMappingPropertyNames {
return [self mj_totalObjectsWithSelector:@selector(mj_objectMappingPropertyNames) key:&MJObjectMappingPropertyNamesKey];
}

#pragma mark - 序列化黑名单配置

+ (void)mj_setupIgnoredJSONSerializationPropertyNames:(MJIgnoredJSONSerializationPropertyNames)ignoredJSONSerializationPropertyNames {
[self mj_setupBlockReturnValue:ignoredJSONSerializationPropertyNames key:&MJIgnoredJSONSerializationPropertyNamesKey];
}

+ (NSMutableArray *)mj_totalIgnoredJSONSerializationPropertyNames {
return [self mj_totalObjectsWithSelector:@selector(mj_ignoredJSONSerializaitonPropertyNames) key:&MJIgnoredJSONSerializationPropertyNamesKey];
}

+ (void)mj_setupIgnoreObjectMappingPropertyNames:(MJIgnoredObjectMappingPropertyNames)ignoredObjectMappingPropertyNames {
[self mj_setupBlockReturnValue:ignoredObjectMappingPropertyNames key:&MJIgnoredObjectMappingPropertyNamesKey];
}

+ (NSMutableArray *)mj_totalIgnoredObjectMappingPropertyNames {
return [self mj_totalObjectsWithSelector:@selector(mj_ignoredObjectMappingPropertyNames) key:&MJIgnoredObjectMappingPropertyNamesKey];
}

#pragma mark - block和方法处理:存储block的返回值
+ (void)mj_setupBlockReturnValue:(id (^)())block key:(const char *)key
{
Expand Down
68 changes: 68 additions & 0 deletions MJExtension/NSObject+MJKeyValue.h
Expand Up @@ -26,6 +26,26 @@
*/
+ (NSArray *)mj_ignoredPropertyNames;

/**
* 这个数组中的属性名才会进行JSON序列化
*/
+ (NSArray *)mj_jsonSerializationPropertyNames;

/**
* 这个数组中的属性名才会序列化到object中
*/
+ (NSArray *)mj_objectMappingPropertyNames;

/*
* 这个数组中的属性名会被忽略:不会进行JSON序列化
*/
+ (NSArray *)mj_ignoredJSONSerializaitonPropertyNames;

/**
* 这个数组中的属性名会被忽略:不会序列化到object中
*/
+ (NSArray *)mj_ignoredObjectMappingPropertyNames;

/**
* 将属性名换为其他key去字典中取值
*
Expand Down Expand Up @@ -110,6 +130,24 @@
+ (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys;
+ (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys;


/**
* 通过模型数组来创建一个字典数组
* @param objectSet 模型数组
* @return 字典数组
*/
+ (NSMutableArray *)mj_keyValuesArrayWithObjectSet:(NSSet *)objectSet;
+ (NSMutableArray *)mj_keyValuesArrayWithObjectSet:(NSSet *)objectSet keys:(NSArray *)keys;
+ (NSMutableArray *)mj_keyValuesArrayWithObjectSet:(NSSet *)objectSet ignoredKeys:(NSArray *)ignoredKeys;

/**
* 通过模型数组来创建一个字典数组
* @param objectOrderedSet 模型数组
* @return 字典数组
*/
+ (NSMutableArray *)mj_keyValuesArrayWithObjectOrderedSet:(NSOrderedSet *)objectOrderedSet;
+ (NSMutableArray *)mj_keyValuesArrayWithObjectOrderedSet:(NSOrderedSet *)objectOrderedSet keys:(NSArray *)keys;
+ (NSMutableArray *)mj_keyValuesArrayWithObjectOrderedSet:(NSOrderedSet *)objectOrderedSet ignoredKeys:(NSArray *)ignoredKeys;
#pragma mark - 字典转模型
/**
* 通过字典来创建一个模型
Expand Down Expand Up @@ -156,6 +194,36 @@
*/
+ (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context;

/**
* 通过字典数组来创建一个模型数组
* @param keyValuesArray 字典数组(可以是NSDictionary、NSData、NSString)
* @return 模型数组
*/
+ (NSMutableSet *)mj_objectSetWithKeyValuesArray:(id)keyValuesArray;

/**
* 通过字典数组来创建一个模型数组,
* @param keyValuesArray 字典数组(可以是NSDictionary、NSData、NSString)
* @param context CoreData上下文
* @return 模型数组
*/
+ (NSMutableSet *)mj_objectSetWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context;

/**
* 通过字典数组来创建一个模型数组
* @param keyValuesArray 字典数组(可以是NSDictionary、NSData、NSString)
* @return 模型数组
*/
+ (NSMutableOrderedSet *)mj_objectOrderedSetWithKeyValuesArray:(id)keyValuesArray;

/**
* 通过字典数组来创建一个模型数组,
* @param keyValuesArray 字典数组(可以是NSDictionary、NSData、NSString)
* @param context CoreData上下文
* @return 模型数组
*/
+ (NSMutableOrderedSet *)mj_objectOrderedSetWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context;

/**
* 通过plist来创建一个模型数组
* @param filename 文件名(仅限于mainBundle中的文件)
Expand Down