数据持久化: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
网友评论