// // MOConfigBaseData.m // // Created by SuperCabbage on 2023/12/11 // Copyright (c) 2023 __MyCompanyName__. All rights reserved. // #import "MOConfigBaseData.h" #import "MOConfigList.h" #import "MOLiveActivityForAnchor.h" NSString *const kMOConfigBaseDataConfig = @"video"; NSString *const kMOConfigBaseDataDivideRates = @"divideRates"; NSString *const kMOConfigBaseDataTickets = @"tickets"; NSString *const kMOConfigBaseDataConfigList = @"voice"; NSString *const kMOConfigBaseDataTitle = @"title"; NSString *const kMOConfigBaseDataLogoVideo = @"logoVideo"; NSString *const kMOConfigBaseDataLogoVoice = @"logoVoice"; NSString *const kMOConfigBaseDataTagVideo = @"tagVideo"; NSString *const kMOConfigBaseDataTagVoice = @"tagVoice"; NSString *const kMOConfigBaseDataLiveActivityForAnchor = @"liveActivityForAnchor"; @interface MOConfigBaseData () - (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict; @end @implementation MOConfigBaseData @synthesize config = _config; @synthesize divideRates = _divideRates; @synthesize tickets = _tickets; @synthesize configList = _configList; @synthesize title = _title; @synthesize logoVideo = _logoVideo; @synthesize logoVoice = _logoVoice; @synthesize tagVideo = _tagVideo; @synthesize tagVoice = _tagVoice; @synthesize liveActivityForAnchor = _liveActivityForAnchor; + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict { return [[self alloc] initWithDictionary:dict]; } - (instancetype)initWithDictionary:(NSDictionary *)dict { self = [super init]; // This check serves to make sure that a non-NSDictionary object // passed into the model class doesn't break the parsing. if (self && [dict isKindOfClass:[NSDictionary class]]) { NSObject *receivedMOConfig = [dict objectForKey:kMOConfigBaseDataConfig]; NSMutableArray *parsedMOConfig = [NSMutableArray array]; if ([receivedMOConfig isKindOfClass:[NSArray class]]) { for (NSDictionary *item in (NSArray *)receivedMOConfig) { if ([item isKindOfClass:[NSDictionary class]]) { [parsedMOConfig addObject:[MOConfigList modelObjectWithDictionary:item]]; } } } else if ([receivedMOConfig isKindOfClass:[NSDictionary class]]) { [parsedMOConfig addObject:[MOConfigList modelObjectWithDictionary:(NSDictionary *)receivedMOConfig]]; } self.config = [NSArray arrayWithArray:parsedMOConfig]; self.divideRates = [self objectOrNilForKey:kMOConfigBaseDataDivideRates fromDictionary:dict]; self.tickets = [self objectOrNilForKey:kMOConfigBaseDataTickets fromDictionary:dict]; NSObject *receivedMOConfigList = [dict objectForKey:kMOConfigBaseDataConfigList]; NSMutableArray *parsedMOConfigList = [NSMutableArray array]; if ([receivedMOConfigList isKindOfClass:[NSArray class]]) { for (NSDictionary *item in (NSArray *)receivedMOConfigList) { if ([item isKindOfClass:[NSDictionary class]]) { [parsedMOConfigList addObject:[MOConfigList modelObjectWithDictionary:item]]; } } } else if ([receivedMOConfigList isKindOfClass:[NSDictionary class]]) { [parsedMOConfigList addObject:[MOConfigList modelObjectWithDictionary:(NSDictionary *)receivedMOConfigList]]; } self.configList = [NSArray arrayWithArray:parsedMOConfigList]; self.title = [self objectOrNilForKey:kMOConfigBaseDataTitle fromDictionary:dict]; self.logoVideo = [self objectOrNilForKey:kMOConfigBaseDataLogoVideo fromDictionary:dict]; self.logoVoice = [self objectOrNilForKey:kMOConfigBaseDataLogoVoice fromDictionary:dict]; self.tagVideo = [MOConfigList modelObjectWithDictionary:[dict objectForKey:kMOConfigBaseDataTagVideo]]; self.tagVoice = [MOConfigList modelObjectWithDictionary:[dict objectForKey:kMOConfigBaseDataTagVoice]]; self.liveActivityForAnchor = [MOLiveActivityForAnchor modelObjectWithDictionary:[dict objectForKey:kMOConfigBaseDataLiveActivityForAnchor]]; } return self; } - (NSDictionary *)dictionaryRepresentation { NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary]; NSMutableArray *tempArrayForConfig = [NSMutableArray array]; for (NSObject *subArrayObject in self.config) { if ([subArrayObject respondsToSelector:@selector(dictionaryRepresentation)]) { // This class is a model object [tempArrayForConfig addObject:[subArrayObject performSelector:@selector(dictionaryRepresentation)]]; } else { // Generic object [tempArrayForConfig addObject:subArrayObject]; } } [mutableDict setValue:[NSArray arrayWithArray:tempArrayForConfig] forKey:kMOConfigBaseDataConfig]; NSMutableArray *tempArrayForDivideRates = [NSMutableArray array]; for (NSObject *subArrayObject in self.divideRates) { if ([subArrayObject respondsToSelector:@selector(dictionaryRepresentation)]) { // This class is a model object [tempArrayForDivideRates addObject:[subArrayObject performSelector:@selector(dictionaryRepresentation)]]; } else { // Generic object [tempArrayForDivideRates addObject:subArrayObject]; } } [mutableDict setValue:[NSArray arrayWithArray:tempArrayForDivideRates] forKey:kMOConfigBaseDataDivideRates]; NSMutableArray *tempArrayForTickets = [NSMutableArray array]; for (NSObject *subArrayObject in self.tickets) { if ([subArrayObject respondsToSelector:@selector(dictionaryRepresentation)]) { // This class is a model object [tempArrayForTickets addObject:[subArrayObject performSelector:@selector(dictionaryRepresentation)]]; } else { // Generic object [tempArrayForTickets addObject:subArrayObject]; } } [mutableDict setValue:[NSArray arrayWithArray:tempArrayForTickets] forKey:kMOConfigBaseDataTickets]; NSMutableArray *tempArrayForConfigList = [NSMutableArray array]; for (NSObject *subArrayObject in self.configList) { if ([subArrayObject respondsToSelector:@selector(dictionaryRepresentation)]) { // This class is a model object [tempArrayForConfigList addObject:[subArrayObject performSelector:@selector(dictionaryRepresentation)]]; } else { // Generic object [tempArrayForConfigList addObject:subArrayObject]; } } [mutableDict setValue:[NSArray arrayWithArray:tempArrayForConfigList] forKey:kMOConfigBaseDataConfigList]; [mutableDict setValue:self.title forKey:kMOConfigBaseDataTitle]; [mutableDict setValue:self.logoVideo forKey:kMOConfigBaseDataLogoVideo]; [mutableDict setValue:self.logoVoice forKey:kMOConfigBaseDataLogoVoice]; [mutableDict setValue:[self.tagVideo dictionaryRepresentation] forKey:kMOConfigBaseDataTagVideo]; [mutableDict setValue:[self.tagVoice dictionaryRepresentation] forKey:kMOConfigBaseDataTagVoice]; [mutableDict setValue:[self.liveActivityForAnchor dictionaryRepresentation] forKey:kMOConfigBaseDataLiveActivityForAnchor]; return [NSDictionary dictionaryWithDictionary:mutableDict]; } - (NSString *)description { return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]]; } #pragma mark - Helper Method - (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict { id object = [dict objectForKey:aKey]; return [object isEqual:[NSNull null]] ? nil : object; } #pragma mark - NSCoding Methods - (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; self.config = [aDecoder decodeObjectForKey:kMOConfigBaseDataConfig]; self.divideRates = [aDecoder decodeObjectForKey:kMOConfigBaseDataDivideRates]; self.tickets = [aDecoder decodeObjectForKey:kMOConfigBaseDataTickets]; self.configList = [aDecoder decodeObjectForKey:kMOConfigBaseDataConfigList]; self.title = [aDecoder decodeObjectForKey:kMOConfigBaseDataTitle]; self.logoVideo = [aDecoder decodeObjectForKey:kMOConfigBaseDataLogoVideo]; self.logoVoice = [aDecoder decodeObjectForKey:kMOConfigBaseDataLogoVoice]; self.tagVideo = [aDecoder decodeObjectForKey:kMOConfigBaseDataTagVideo]; self.tagVoice = [aDecoder decodeObjectForKey:kMOConfigBaseDataTagVoice]; self.liveActivityForAnchor = [aDecoder decodeObjectForKey:kMOConfigBaseDataLiveActivityForAnchor]; return self; } - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_config forKey:kMOConfigBaseDataConfig]; [aCoder encodeObject:_divideRates forKey:kMOConfigBaseDataDivideRates]; [aCoder encodeObject:_tickets forKey:kMOConfigBaseDataTickets]; [aCoder encodeObject:_configList forKey:kMOConfigBaseDataConfigList]; [aCoder encodeObject:_title forKey:kMOConfigBaseDataTitle]; [aCoder encodeObject:_logoVideo forKey:kMOConfigBaseDataLogoVideo]; [aCoder encodeObject:_logoVoice forKey:kMOConfigBaseDataLogoVoice]; [aCoder encodeObject:_tagVideo forKey:kMOConfigBaseDataTagVideo]; [aCoder encodeObject:_tagVoice forKey:kMOConfigBaseDataTagVoice]; [aCoder encodeObject:_liveActivityForAnchor forKey:kMOConfigBaseDataLiveActivityForAnchor]; } - (id)copyWithZone:(NSZone *)zone { MOConfigBaseData *copy = [[MOConfigBaseData alloc] init]; if (copy) { copy.config = [self.config copyWithZone:zone]; copy.divideRates = [self.divideRates copyWithZone:zone]; copy.tickets = [self.tickets copyWithZone:zone]; copy.configList = [self.configList copyWithZone:zone]; copy.title = [self.title copyWithZone:zone]; copy.logoVideo = [self.logoVideo copyWithZone:zone]; copy.logoVoice = [self.logoVoice copyWithZone:zone]; copy.tagVideo = [self.tagVideo copyWithZone:zone]; copy.tagVoice = [self.tagVoice copyWithZone:zone]; copy.liveActivityForAnchor = [self.liveActivityForAnchor copyWithZone:zone]; } return copy; } @end