数据持久化、音频处理

数据持久化:data persistent

存数据:

-> 基本数据类型:NSString,NSArray,NSDictionary....

-> persistent持久化:把基本数据类型存储的数据存储到文件中

why?“永久”的保存基本的数据类型存储数据到文件中: memory内存->disk磁盘

基本数据类型->数据容器(一般情况下会存在/Document/xxx);

实现方法:

-> NSUserDefaults

步骤:

1-》获取单例对象NSUserDefaults*defaults = [NSUserDefaultsstandardUserDefaults];

2-》内存-》磁盘(文件)[指定key,选方法]:使用set方法,给key dic[@“key”] = value;

[defaultssetBool:YESforKey:@"login"];

[defaultssetInteger:1forKey:@"count"];

NSArray*array =@[@"rose",@"jack"];

[defaultssetObject:arrayforKey:@"array"];

//强制把设置的值写入文件中

[defaultssynchronize];

3->读,通过key获取存在文件中的数据;

NSUserDefaults*defaults =[NSUserDefaultsstandardUserDefaults];

//根据不同的类型选择不同的方法

BOOLisLogin = [defaultsboolForKey:@"login"];

NSIntegerinteger = [defaultsintegerForKey:@"count"];

NSArray*array = [defaultsarrayForKey:@"array"];

数据存储到了 /Library/Perferences/BundleIdentifier.plist;

使用场景:不适合存储“大量”的数据写/读

-> PList(Property List)属性列表  (是一个特殊的xml)

Root根:type:NSArray/NSDictionary

写:NSDictionary ->->writeToFile...

读:根据root类型选择接受数据的类型

//文件路径

@property(nonatomic,strong)NSString*plistPath;

-(void)writeAndReadFromPList

{

NSString*doucumentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)firstObject];

self.plistPath= [doucumentPathstringByAppendingPathComponent:@"test.plist"];

NSDictionary*dic =@{@"name":@"rose",@"skills":@[@"objective-c",@"Ruby",@"Python"]};

[dicwriteToFile:self.plistPathatomically:YES];

//从指定的路径读取plist文件中得数据(root/写入类型)

NSDictionary*readDic = [[NSDictionaryalloc]initWithContentsOfFile:self.plistPath];

//验证

NSLog(@"读取的数据:%@",readDic);

}

-(void)createPListAndReadData

{

//获取test.plist路径

NSString*plistPath = [[NSBundlemainBundle]pathForResource:@"test"ofType:@"plist"];

//根据root类型接收收据

NSFileHandle*array = [NSFileHandlefileHandleForReadingAtPath:plistPath];

NSLog(@"%@",array);

NSArray*dataArray = [[NSArrayalloc]initWithContentsOfFile:plistPath];

for(NSDictionary*dicindataArray) {

NSLog(@"dic:%@",dic);

}

}

适用场景:

1.优势:一次性把plist所有的数据全都读取出来(批量处理数据)

2.缺点:只支持基本的数据类型(String/Data/Date/Array/Number/Dictionary);

-> 归档/解档 :Archiving(理解)

前提:必须遵守NSCoding协议的任何类型,才可以用归档解档

适用场景:不仅支持基本数据类型,也支持自定义类型;

//文件路径

@property(nonatomic,strong)NSString*archivingFilePath;

-(NSString*)archivingFilePath

{

if(!_archivingFilePath)

{

NSString*documentPath =                      [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)firstObject];

_archivingFilePath= [documentPathstringByAppendingPathComponent:@"archivingFile"];

}

return_archivingFilePath;

}

步骤:1.归档(写入的过程Archive)

-(void)writeDataByArchiving

{

//数据源

NSArray*array =@[@"Jonny",@18,@[@"swift",@"c"]];

//1创建一个可变的数据类型

NSMutableData*mutableData = [NSMutableDatadata];

NSLog(@"编码前的数据长度:%ld",(unsignedlong)mutableData.length);

//2创建一个归档对象执行写入的动作

NSKeyedArchiver*archiver = [[NSKeyedArchiveralloc]initForWritingWithMutableData:mutableData];

//3对要存入的数据进行编码,编码的目的是保存为2进制的

[archiverencodeObject:arrayforKey:@"array"];

//4执行一次完成编码的操作

[archiverfinishEncoding];

NSLog(@"编码后的数据长度:%ld",(unsignedlong)mutableData.length);

//5将编码完的运算写到文件里

[mutableDatawriteToFile:self.archivingFilePathatomically:YES];

}

2.解档(读取的过程Unarchive)

-(void)readDataByUnArchiving

{

//1从指定的文件中读取数据

NSData*data = [NSDatadataWithContentsOfFile:self.archivingFilePath];

//2创建解档对象

NSKeyedUnarchiver*unArchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:data];

//3对解档对象进行解码操作

NSArray*array = [unArchiverdecodeObjectForKey:@"array"];

//4执行完成解码

[unArchiverfinishDecoding];

//打印验证

NSLog(@"%@",array);

自定义模型类步骤:

1 遵守NSCoding协议

2 实现两个方法(编码/解码)

3 对模型类所有的属性都要进行编码/解码

LQStudent.h

#import

@interfaceLQStudent :NSObject

@property(nonatomic,strong)NSString*name;

@property(nonatomic,assign)NSIntegerage;

//给定名字和年龄,返回一个已经创建好的instance实例对象

-(id)initWithName:(NSString*)name addAge:(int)age;

@end

LQStudent.m

#import"LQStudent.h"

@implementationLQStudent

-(id)initWithName:(NSString*)name addAge:(int)age

{

self= [superinit];

if(self) {

//赋值

self.name= name;

self.age= age;

}

returnself;

}

#pragma mark- NSCoding

//时机:归档(编码)调用该方法

- (void)encodeWithCoder:(NSCoder*)aCoder

{

//所有的属性进行编码操作

[aCoderencodeObject:self.nameforKey:@"name"];

[aCoderencodeInteger:self.ageforKey:@"age"];

NSLog(@"对属性进行编码");

}

//时机:解档(解码)调用该方法

- (id)initWithCoder:(NSCoder*)aDecoder

{

NSLog(@"对属性进行解码");

if(self= [superinit]) {

//所有的属性进行解码操作

self.name= [aDecoderdecodeObjectForKey:@"name"];

self.age= [aDecoderdecodeIntegerForKey:@"age"];

}

returnself;

}

@end

-> SQLite:数据库(文件)

-> CoteDat

音频处理

声音文件的生成:

声音采样(2fs)->对声音进行编码操作(压缩算法)->xxx.mp3等

读取声音文件的过程:

读取xxx.mp3->解码(解压缩算法)->还原声音数据->播放

声音存储的最小单位为:帧(Frame)内容

帧内容包括:帧头;声音数据

码率BitRate:声音压缩质量(越高越好) 128kbit/s;320kbit/s

IOS支持的音频格式:xxx.mp3

包含两个部分:文件格式(音频容器)+数据格式(音频编码)

终端上的3个命令(了解):

MAC系统支持的音频格式:afconvert -hf      afinfo xxx.mp3

使用代码播放音频文件

功能1:播放音效(系统/自带的)short audio

播放系统所提供的音频/震动 AudioToolBox FrameWork(底层:C语言)

特点:<30s:音效; 不能暂停

功能2:AVFoundation FrameWork(指定音频文件的播放)  AVAudioPlayer(本地音频播放)

#import

@interfaceViewController()

@property(nonatomic,strong)AVAudioPlayer*player;

@end

@implementationViewController

- (void)viewDidLoad {

[superviewDidLoad];

//播放系统的声音/震动/<30s音效

[selfplaySystemAudio];

//初始化palyer对象(音频文件的路径)

NSURL*fileURL = [[NSBundlemainBundle]URLForResource:@"AllOfMe"withExtension:@"mp3"];

self.player= [[AVAudioPlayeralloc]initWithContentsOfURL:fileURLerror:nil];

//播放

[self.playerplay];

}

-(void)playSystemAudio

{

/*前提:真机播放系统色声音/震动

//1000~2000数字

AudioServicesPlaySystemSound(1600);

//震动

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

*/

//<30s的音频文件

//获取音频文件的路径

NSString*audioPath = [[NSBundlemainBundle]pathForResource:@"audio"ofType:@"wav"];

/*

URL(Uniform Resouce Locator:统一资源定位符)

*/

NSURL*audioURL = [NSURLfileURLWithPath:audioPath];

SystemSoundIDsystemID;

AudioServicesCreateSystemSoundID((__bridgeCFURLRef)(audioURL), &systemID);

//播放

AudioServicesPlaySystemSound(systemID);

}

@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,478评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,825评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,482评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,726评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,633评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,018评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,168评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,320评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,264评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,288评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,995评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,587评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,909评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,284评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,862评论 2 339

推荐阅读更多精彩内容