美文网首页
数据持久化、音频处理

数据持久化、音频处理

作者: 倒影里浅笑 | 来源:发表于2017-04-14 11:53 被阅读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

    相关文章

      网友评论

          本文标题:数据持久化、音频处理

          本文链接:https://www.haomeiwen.com/subject/wcewattx.html