|
15 | 15 |
|
16 | 16 | @implementation NSObject (MJKeyValue)
|
17 | 17 |
|
18 |
| -static const char MJIgnoreReplacedKeyWhenGettingKeyValuesKey = '\0'; |
| 18 | +static const char MJReferenceReplacedKeyWhenCreatingKeyValuesKey = '\0'; |
19 | 19 |
|
20 |
| -- (void)setIgnoreReplacedKeyWhenGettingKeyValues:(BOOL)ignoreReplacedKeyWhenGettingKeyValues |
| 20 | ++ (void)referenceReplacedKeyWhenCreatingKeyValues:(BOOL)reference |
21 | 21 | {
|
22 |
| - objc_setAssociatedObject(self, &MJIgnoreReplacedKeyWhenGettingKeyValuesKey, @(ignoreReplacedKeyWhenGettingKeyValues), OBJC_ASSOCIATION_ASSIGN); |
| 22 | + objc_setAssociatedObject(self, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey, @(reference), OBJC_ASSOCIATION_ASSIGN); |
23 | 23 | }
|
24 | 24 |
|
25 |
| -- (BOOL)isIgnoreReplacedKeyWhenGettingKeyValues |
| 25 | ++ (BOOL)isReferenceReplacedKeyWhenCreatingKeyValues |
26 | 26 | {
|
27 |
| - return [objc_getAssociatedObject(self, &MJIgnoreReplacedKeyWhenGettingKeyValuesKey) boolValue]; |
| 27 | + return [objc_getAssociatedObject(self, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey) boolValue]; |
28 | 28 | }
|
29 | 29 |
|
30 | 30 | #pragma mark - --常用的对象--
|
@@ -111,7 +111,7 @@ - (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)con
|
111 | 111 | keyValues = [NSJSONSerialization JSONObjectWithData:keyValues options:kNilOptions error:nil];
|
112 | 112 | }
|
113 | 113 |
|
114 |
| - MJAssertError([keyValues isKindOfClass:[NSDictionary class]] || [keyValues isKindOfClass:[NSArray class]], self, error, @"keyValues参数不是一个字典或者数组"); |
| 114 | + MJAssertError([keyValues isKindOfClass:[NSDictionary class]], self, error, @"keyValues参数不是一个字典"); |
115 | 115 |
|
116 | 116 | @try {
|
117 | 117 | Class aClass = [self class];
|
@@ -336,7 +336,53 @@ - (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys ignoredKeys:(NSArray
|
336 | 336 | }
|
337 | 337 |
|
338 | 338 | // 4.赋值
|
339 |
| - keyValues[property.name] = value; |
| 339 | + if ([aClass isReferenceReplacedKeyWhenCreatingKeyValues]) { |
| 340 | + NSArray *propertyKeys = [property propertyKeysFromClass:aClass]; |
| 341 | + NSUInteger keyCount = propertyKeys.count; |
| 342 | + // 创建字典 |
| 343 | + __block id innerContainer = keyValues; |
| 344 | + [propertyKeys enumerateObjectsUsingBlock:^(MJPropertyKey *propertyKey, NSUInteger idx, BOOL *stop) { |
| 345 | + // 下一个属性 |
| 346 | + MJPropertyKey *nextPropertyKey = nil; |
| 347 | + if (idx != keyCount - 1) { |
| 348 | + nextPropertyKey = propertyKeys[idx + 1]; |
| 349 | + } |
| 350 | + |
| 351 | + if (nextPropertyKey) { // 不是最后一个key |
| 352 | + // 当前propertyKey对应的字典或者数组 |
| 353 | + id tempInnerContainer = [propertyKey valueForObject:innerContainer]; |
| 354 | + if (tempInnerContainer == nil || [tempInnerContainer isKindOfClass:[NSNull class]]) { |
| 355 | + if (nextPropertyKey.type == MJPropertyKeyTypeDictionary) { |
| 356 | + tempInnerContainer = [NSMutableDictionary dictionary]; |
| 357 | + } else { |
| 358 | + tempInnerContainer = [NSMutableArray array]; |
| 359 | + } |
| 360 | + if (propertyKey.type == MJPropertyKeyTypeDictionary) { |
| 361 | + innerContainer[propertyKey.name] = tempInnerContainer; |
| 362 | + } else { |
| 363 | + innerContainer[propertyKey.name.intValue] = tempInnerContainer; |
| 364 | + } |
| 365 | + } |
| 366 | + |
| 367 | + if ([tempInnerContainer isKindOfClass:[NSMutableArray class]]) { |
| 368 | + int index = nextPropertyKey.name.intValue; |
| 369 | + while ([tempInnerContainer count] < index + 1) { |
| 370 | + [tempInnerContainer addObject:[NSNull null]]; |
| 371 | + } |
| 372 | + } |
| 373 | + |
| 374 | + innerContainer = tempInnerContainer; |
| 375 | + } else { // 最后一个key |
| 376 | + if (propertyKey.type == MJPropertyKeyTypeDictionary) { |
| 377 | + innerContainer[propertyKey.name] = value; |
| 378 | + } else { |
| 379 | + innerContainer[propertyKey.name.intValue] = value; |
| 380 | + } |
| 381 | + } |
| 382 | + }]; |
| 383 | + } else { |
| 384 | + keyValues[property.name] = value; |
| 385 | + } |
340 | 386 | }];
|
341 | 387 |
|
342 | 388 | // 去除系统自动增加的元素
|
|
0 commit comments