数据持久化、音频处理

2017-04-14  本文已影响11人  倒影里浅笑

数据持久化: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

上一篇下一篇

猜你喜欢

热点阅读