addressBookHelper

/**
 *  Model类:存储数据的类叫做Model类.(AddressPerson,PhotoInfo)
    Model层的类:只要和数据有关的类都是Model层的类.(比如:数据存储的类,数据处理的类,数据请求类,数据解析类).
 */
/**
 *  MVC:M层的任务是为了分担Controller数据处理的功能,让C只处理M与V之间的通讯,不做数据处理.而AddressBookHelper就是帮助AddressBookListController瘦身的,分担数据数据的模块.
    而对于该助手类来说,对于数据处理,只需要一个助手就可以了,所以该类采用单例设计模式.
 */
@interface FYZAddressBookHelper : NSObject
+ (FYZAddressBookHelper *)sharedAddressBookHelper;
//返回分区的个数
+ (NSInteger)numberOfSections;
//返回指定分区的行数
+ (NSInteger)numberOfRowsInSection:(NSInteger)section;
//返回对应的AddressPerson对象
+ (AddressPerson *)addressPersonAtIndexPath:(NSIndexPath *)indexPath;
//返回每个分区的title
+ (NSString *)titleForHeaderInSection:(NSInteger )section;
//返回索引值
+ (NSArray *)sectionIndexTitles;
//是否删除整个分区
+ (BOOL)isNeedDeleteSection:(NSInteger)section;
//删除整个分区
+ (void)deleteOneSection:(NSInteger)section;
//删除一行
+ (void)deleteRowAtIndexPath:(NSIndexPath *)indexPath;
//移动数据
+ (void)moveAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;
//添加数据
+ (void)addAddresPerson:(AddressPerson *)person;
//保存数据
+ (void)saveData;
@end

<p style="margin-top: 0px; margin-bottom: 0px; font-size: 24px; font-family: Menlo; color: rgb(201, 27, 19);"><pre name="code" class="objc"><pre name="code" class="objc"><pre name="code" class="objc">#import "FYZAddressBookHelper.h"
#import "NSString+Addition.h"



#define kFileName @"person.plist"
@interface FYZAddressBookHelper ()

@property (nonatomic, retain) NSMutableDictionary *addressBookDic; //存储联系人信息
@property (nonatomic, retain) NSMutableArray *orderedKeys;//存储排好序的key

@end
@implementation FYZAddressBookHelper

//把该静态变量定义在方法之外,在整个.m文件中都可以访问.
static FYZAddressBookHelper *helper = nil;
+ (FYZAddressBookHelper *)sharedAddressBookHelper
{
    //加一个同步锁,保证同一时刻只有一个线程访问.
    @synchronized(self) {
        if (!helper) {
            helper = [[FYZAddressBookHelper alloc] init];
            
            //判断之前在Documents文件夹下是否存储过数据,
            //(1)先获取person.plist文件路径
            NSString *filePath = [self getFilePath];
            //(2)判断该路径是否存在。(路径是否正确)
            NSFileManager *manager = [NSFileManager defaultManager];
            BOOL isExist = [manager fileExistsAtPath:filePath];
            if (isExist) {
                //如果存储过数据,则在Documents文件夹下读取,
                [helper readDataFromDocuments];
            } else {
                //如果没有,则在包中的plist文件读取.
                [helper readDataFromPlist];
            }
        }
    }
    return helper;
}
//从documents文件夹下的person.plist文件中读取
//反归档
- (void)readDataFromDocuments
{
    //根基文件路径初始化一个NSMutableData对象
    NSMutableData *data = [NSMutableData dataWithContentsOfFile:[[self class] getFilePath]];
    //创建反归档对象
    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    //反归档
    self.addressBookDic = [unArchiver decodeObjectForKey:@"person"];
    //结束反归档
    [unArchiver finishDecoding];
    RELEASE_SAFE(unArchiver);
    //获取排好序的key值
    NSArray *sortedKeys = [[self.addressBookDic allKeys] sortedArrayUsingSelector:@selector(compare:)];
    //将不可变的数组转化为可变数组
    self.orderedKeys = [NSMutableArray arrayWithArray:sortedKeys];
}
//从本地文件读取数据
- (void)readDataFromPlist
{
    //1.先获取文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"AddressBook" ofType:@"plist"];
    //2.根据文件路径初始化字典对象
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
    //3.创建可变字典存储联系人数据
    self.addressBookDic = [NSMutableDictionary dictionaryWithDictionary:dic];
    //4.将字典封装成AddressPerson对象
    //(1)遍历字典得到key
    for (NSString *key in dic) {
        //(2)根据key获取对应的数组
        NSArray *group = dic[key];
        //(3)创建可变数组,存储AddressPerson对象
        NSMutableArray *newGroup = [NSMutableArray array];
        //(4)遍历数组,得到字典,将字典封装成AddressPerson对象
        for (NSDictionary *tempDic in group) {
            AddressPerson *person = [[AddressPerson alloc] initWithDic:tempDic];
            [newGroup addObject:person];
            RELEASE_SAFE(person);
        }
        //(5)替换掉字典中key对应的存储字典的不可变数组.(使用存储对象的可变数组)
        [self.addressBookDic setObject:newGroup forKey:key];
    }
    //5.获取字典中所有的key,并且升序排序
    NSArray *sortedKeys = [[self.addressBookDic allKeys] sortedArrayUsingSelector:@selector(compare:)];
    //6.将不可变数组转换成可变数组
    self.orderedKeys = [NSMutableArray arrayWithArray:sortedKeys];
}
+ (NSInteger)numberOfSections
{
    return [self sharedAddressBookHelper].orderedKeys.count;
}
+ (NSInteger)numberOfRowsInSection:(NSInteger)section
{
    //1.先获取key
//    NSString *key = helper.orderedKeys[section];
//    //2.根据key获取对应的小数组
//    NSMutableArray *group = helper.addressBookDic[key];
//    //3.求出小数组元素个数
//    return [group count];
    return [helper.addressBookDic[helper.orderedKeys[section]] count];
}
+ (AddressPerson *)addressPersonAtIndexPath:(NSIndexPath *)indexPath
{
    //1.先获取key
    //2.获取key 对应的小数组
    //3.从小数组中获取对应的对象
    return helper.addressBookDic[helper.orderedKeys[indexPath.section]][indexPath.row];
}
+ (NSString *)titleForHeaderInSection:(NSInteger )section
{
    return helper.orderedKeys[section];
}
+ (NSArray *)sectionIndexTitles
{
    return helper.orderedKeys;
}
//是否删除整个分区
+ (BOOL)isNeedDeleteSection:(NSInteger)section
{
    //当对应的数组中只有一个元素时,需要删除整个分区.
    NSMutableArray *group = helper.addressBookDic[helper.orderedKeys[section]];
    return group.count == 1 ? YES : NO;
}
//删除整个分区
+ (void)deleteOneSection:(NSInteger)section
{
    //(1)从字典中移除对应的分组
    NSString *key = helper.orderedKeys[section];
    [helper.addressBookDic removeObjectForKey:key];
    //(2)从排好序的key中移除分组对应的key
    [helper.orderedKeys removeObjectAtIndex:section];
}
//删除一行
+ (void)deleteRowAtIndexPath:(NSIndexPath *)indexPath
{
    //(1)先获取key
    NSString *key = helper.orderedKeys[indexPath.section];
    //(2)获取数组
    NSMutableArray *group = helper.addressBookDic[key];
    //(3)移除元素
    [group removeObjectAtIndex:indexPath.row];
}
//移动
+ (void)moveAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    //(1)将原来数据删除掉
    NSString *key = helper.orderedKeys[sourceIndexPath.section];
    NSMutableArray *group = helper.addressBookDic[key];
    
    //在删除之前先retain
    AddressPerson *person = [[group objectAtIndex:sourceIndexPath.row] retain];
    
    [group removeObjectAtIndex:sourceIndexPath.row];
    //(2)插入新的数据
    [group insertObject:person atIndex:destinationIndexPath.row];
    RELEASE_SAFE(person);
}
//@"范玉贞" fanyuzhen //F
+ (void)addAddresPerson:(AddressPerson *)person
{
    //获取拼音第一个字符,@"F"
    NSString *first = [person.name firstCharactor];
    //(1)根据key从字典中取对应的分组
    NSMutableArray *group = helper.addressBookDic[first];//@"F"
    if (!group) {
        //如果字典中没有该元素
        group = [NSMutableArray array];
        //将对应key与分组存入字典中
        [helper.addressBookDic setObject:group forKey:first];
        
        //添加联系人
        //重新读取orderedKeys
        //5.获取字典中所有的key,并且升序排序
        NSArray *sortedKeys = [[helper.addressBookDic allKeys] sortedArrayUsingSelector:@selector(compare:)];
        //6.将不可变数组转换成可变数组
        helper.orderedKeys = [NSMutableArray arrayWithArray:sortedKeys];
    }
    [group addObject:person];
}
//归档
+ (void)saveData
{
    //1.获取存储的内容
    //helper.addressBookDic;
    //2.获取存储的文件路径
    NSString *filePath = [self getFilePath];
    NSMutableData *data = [NSMutableData data];
    //创建归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //归档
    [archiver encodeObject:helper.addressBookDic forKey:@"person"];
    //结束归档
    [archiver finishEncoding];
    //写入文件
    [data writeToFile:filePath atomically:YES];
    RELEASE_SAFE(archiver);
}

+ (NSString *)getFilePath
{
    //(1)获取documents文件路径
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //(2)获取存储的文件路径(拼接)
    NSString *filePath = [documentsPath stringByAppendingPathComponent:kFileName];
    return filePath;
}
- (void)dealloc
{
    RELEASE_SAFE(_addressBookDic);
    RELEASE_SAFE(_orderedKeys);
    [super dealloc];
}
@end






                
内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值