// // MusicDataManager.m // BuguLive // // Created by 岳克奎 on 16/12/16. // Copyright © 2016年 xfg. All rights reserved. // #import "MusicDataManager.h" @implementation MusicDataManager #pragma mark -life cycle ------------------------------ 生 命 周 期 管 控 区 域 ------------------------------------------ /** * @brief: 单利 * * @discussion:我的想法是,用单利管理,以后把DataModel里面的操作都移除出来、、关于music的数据层单独成模块。放在msuic大分类里。这样看着就合理 */ static MusicDataManager *signleton = nil; + (instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ signleton = [super allocWithZone:zone]; }); return signleton; } + (MusicDataManager *)shareManager { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ signleton = [[self alloc] init]; }); return signleton; } + (id)copyWithZone:(struct _NSZone *)zone { return signleton; } + (id)mutableCopyWithZone:(struct _NSZone *)zone { return signleton; } #pragma mark ----------------------------------------------- 音 乐 部 分 -------------------------------------------- #pragma mark - 音乐 歌词 处理(Data)(Public) /** * @brief: 音乐歌词处理 * * @pram: lrcDataStr 音乐歌词数据(字符串) * @prama:musicInfoMDic 歌词信息 * *@discussion: 音乐model下发数据,通过contentStr(作为数据源),一行读取数据,每行形成一个新的mdoel(LRCMdoel) 每行要分割取数据 * *@use:在选择音乐后,调用,原本想传musicModel 但是考虑日后其他SDK 传入,还是传str,省心省事 * */ - (void)analysisLrcStrOfMusicLRCDataStr:(NSString *)lrcDataStr musicNameStr:(NSString *)musicNameStr musicSingerStr:(NSString *)musicSingerStr complete:(void(^)(BOOL finished,NSMutableArray *lrcModelMArray,NSMutableArray *lrcPointTimeStrArray))block { //歌曲 信息 NSString *musicInfoStr = [NSString stringWithFormat:ASLocalizedString(@"歌曲:%@ 演唱:%@"),musicNameStr, musicSingerStr]; //临时存每行歌词 // 因为分割后 只有时间str+歌词内容str 需要扩展mdoel功能,让model变得很强大才对 NSMutableArray *tempMArray =[@[]mutableCopy]; //存歌词model 数据源 存每行歌词对应的 mdoel NSMutableArray *lrcDataSoureMArray =[@[]mutableCopy]; //存歌词时间 //主要是 因为。C++代理每次来判断歌词时间点,如果直接判断,下一次也就是+1, //但是index直接取数据总是那么不令人放心。所以通过时间点区域 获得index而不是简单的index++,这样代码更加安全 NSMutableArray *lrcPointTimeStrArray =[@[]mutableCopy]; if (lrcDataStr.length<10) { if (block) { block(YES,lrcDataSoureMArray,lrcPointTimeStrArray); } return; } __weak typeof(self)weak_Self = self; //调 enumerateLinesUsingBlock 一行一行的读取数据 [lrcDataStr enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) { //拿到每一行 //判断是否 包含 [] if ([lrcDataStr containsString:@"["]&&[lrcDataStr containsString:@"]"]) { //分割 如果里面是数字 (歌词很多种,特别给出前几行 很多种,看着不爽,直接不要了。前期时间就直接显示歌手+歌名) NSString *regex = @"[0-9]+:[0-9]+\\.[0-9]+"; NSRange r = [line rangeOfString:regex options:NSRegularExpressionSearch]; //存在数字 if(r.location !=NSNotFound) { NSArray *lrcArray = [line componentsSeparatedByString:@"]"]; // NSLog(@"--- array -------%lu",(unsigned long)lrcArray.count); //[00:11.35]我躲在车里 lrcArray.count = 2 1+1 //[01:33.22][00:35.75]我应该在车底 lrcArray.count = 3 2+1 //[02:23.65][02:11.47][01:13.79]不会像我这样孩子气 lrcArray.count = 4 3+1 if (lrcArray.count>1) { for (int i = 0; i number2) { return NSOrderedDescending; } else { return NSOrderedAscending; } }]mutableCopy]; //数据model的扩展成完美nmodle //存歌词时间// for(int i = 0;i= tempMArray.count-1) { nextStr = @""; } else { nextStr = [secondLrcDic[@"lrcContentStr"] isEmpty]?tempMArray[i+2][@"lrcContentStr"]:secondLrcDic[@"lrcContentStr"]; } } NSDictionary *modelDic =@{@"lrcStartTimeStr":firstLrcDic[@"lrcStartTimeStr"], @"lrcEndTimeStr":secondLrcDic[@"lrcStartTimeStr"], @"lrcContentStr":firstLrcDic[@"lrcContentStr"], @"lrcLineNumStr":[NSString stringWithFormat:@"%d",i], @"lrcNextContentStr":nextStr}; [lrcDataSoureMArray addObject:[LrcModel mj_objectWithKeyValues:modelDic]]; } } if (block) { //返回 强大lrcMdoel 和 装有每行时间点的 数组 block(YES,lrcDataSoureMArray,lrcPointTimeStrArray); } } #pragma mark - 时间转S处理(Data) /** * @brief: 时间转S处理( * * @use:将 01:07.45 转为 秒 */ - (NSString *)timeWithString:(NSString *)timeString { // 01:02.38 NSInteger min = [[timeString componentsSeparatedByString:@":"][0] integerValue]; NSInteger sec = [[timeString substringWithRange:NSMakeRange(3, 2)] integerValue]; NSInteger hs = [[timeString componentsSeparatedByString:@"."][1] integerValue]; return [NSString stringWithFormat:@"%f",(min * 60 + sec + hs * 0.01)]; } @end