排行榜实现 (Plist文件)

在APP里面,Plist文件常用于数据存储!


  • A.应用包里的“plist文件”
NSString * path = [[NSBundle mainBundle]pathForResource:@"RankList.plist" ofType:nil];
NSArray * plistArray = [[NSArray alloc] initWithContentsOfFile:path];
for (NSDictionary * dict in plistArray) {
    [self.dataArray addObject:dict];
}

创建:

plist文件的创建

注意应用包里的plist文件 只能读取数据!不能写入数据!

[NSBundle mainBundle]获取到的路径下的文件 不能修改

NSString * path = [[NSBundle mainBundle] pathForResource:@"gg.plist" ofType:nil];
NSDictionary * plistDict = [[NSDictionary alloc] initWithContentsOfFile:path];
NSLog(@"plistDict:%@",plistDict);
   
NSDictionary * addDict = @{
                          @"score":@"123",
                          @"name":@"adama"
                           };

if ([addDict writeToFile:path atomically:YES]) {
      NSLog(@"将数组保存为属性列表文件成功!!");
        
      NSDictionary * plistDict = [[NSDictionary alloc] initWithContentsOfFile:path];
      NSLog(@"plistDict:%@",plistDict);
}else{
        NSLog(@"将数组保存为属性列表文件不成功");
}



打印效果:

2017-08-26 10:03:31.734 plistTest[1604:54082] plistDict:{
}
2017-08-26 10:03:31.735 plistTest[1604:54082] 将数组保存为属性列表文件成功!!
2017-08-26 10:03:31.735 plistTest[1604:54082] plistDict:{
    name = ada;
    score = da;
}

展示存储成功!但并非有效!(每次运行都一样)

plist文件始终不变:

plist文件 始终为空



  • B.沙盒中的“plist文件”
NSArray *sandboxpath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取完整沙盒路径
NSString *documentsDirectory = [sandboxpath objectAtIndex:0];//documents路径
NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"RankList.plist"];
NSArray * plistDataArray = [[NSArray alloc] initWithContentsOfFile:plistPath];
for (NSDictionary * dict in plistDataArray) {
    [self.dataArray addObject:dict];
}






排行榜实现

由于删除、添加、修改数据(考虑到是否存在Plist文件?),故而Plist文件选择在沙盒中创建、使用:


全局变量:

NSString * _jifenStr; //积分数
NSString * _nameStr; //用户名
int _indexWhereAdd; //插入的位置

操作步骤:

NSArray *sandboxpath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取完整路径
NSString *documentsDirectory = [sandboxpath objectAtIndex:0];//沙盒document路径,放着plist文件
NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"RankList.plist"];//plist文件路径


BOOL hasTheRightPlist = NO;  //文档路径下 是否含有plist文件

NSFileManager * fileManger = [NSFileManager defaultManager]; //文件管理类
NSArray * dirArray = [fileManger contentsOfDirectoryAtPath:documentsDirectory error:nil];
for (NSString * str in dirArray) { //遍历文件夹(沙盒document路径)
    if ([str isEqualToString:@"RankList.plist"]) { //含有“RankList.plist”
        hasTheRightPlist = YES;
    }
}



if (hasTheRightPlist == YES) { //沙盒document路径  含有“RankList.plist”文件
    NSArray * plistArray = [[NSArray alloc] initWithContentsOfFile:plistPath];

    for (int i = 0; i < plistArray.count; i++) {
        NSDictionary * dict = plistArray[i];
        
        //比较 历史积分、当前积分  进行排行
        if([_jifenStr integerValue] > [dict[@"score"] integerValue] ) {//大于 直接插入

            UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"提交分数" message:@"恭喜进入排行榜" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确认", nil];
            [alertV setAlertViewStyle:UIAlertViewStylePlainTextInput];
            UITextField * textName = [alertV textFieldAtIndex:0];
            textName.placeholder = @"请输入名字";
            textName.clearButtonMode = UITextFieldViewModeWhileEditing;
            [alertV show];
            alertV.tag = 0;
            
            _indexWhereAdd = i;
            

            break;
        } else { //小于
            if (i == plistArray.count-1 && plistArray.count < 10) { //最后一位 && 个数没超过排行榜限制
                
                UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"提交分数" message:@"恭喜进入排行榜" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确认", nil];
                [alertV setAlertViewStyle:UIAlertViewStylePlainTextInput];
                UITextField * textName = [alertV textFieldAtIndex:0];
                textName.placeholder = @"请输入名字";
                textName.clearButtonMode = UITextFieldViewModeWhileEditing;
                [alertV show];
                alertV.tag = 1;
                
                _indexWhereAdd = i;
                
                
                break;
            }
            
        }
    }
} else {
    
    UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"提交分数" message:@"恭喜进入排行榜" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确认", nil];
    [alertV setAlertViewStyle:UIAlertViewStylePlainTextInput];
    UITextField * textName = [alertV textFieldAtIndex:0];
    textName.placeholder = @"请输入名字";
    textName.clearButtonMode = UITextFieldViewModeWhileEditing;
    [alertV show];
    alertV.tag = 2;
    
    
    //文件夹下,不存在plist文件  直接添加,必定要创建plist文件
    
}



UIAlertView协议: 存储用户数据

#pragma mark - UIAlertViewDelegate
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    UITextField * textNameTF = [alertView textFieldAtIndex:0];
    _nameStr = textNameTF.text; //用户名(输入框)


    if (buttonIndex == 0 && _nameStr.length > 0) { //确认按钮
    
        NSArray *sandboxpath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取完整路径
        NSString *documentsDirectory = [sandboxpath objectAtIndex:0];
        NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"RankList.plist"];
    
        NSArray * plistArray = [[NSArray alloc] initWithContentsOfFile:plistPath];
    

        
        NSMutableArray * addToPlistArr; //存储的数组
        if (plistArray) {
           addToPlistArr = plistArray.mutableCopy;
        } else { //plist数组 不存在
           addToPlistArr = @[].mutableCopy;
        }
        NSDictionary * addDict = @{
                               @"score":_jifenStr,
                               @"name":_nameStr
                               };

        switch (alertView.tag) {
            case 0:{
                [addToPlistArr insertObject:addDict atIndex:_indexWhereAdd];
                if (addToPlistArr.count > 10) { //超过10位,移除最后一位
                    [addToPlistArr removeObjectAtIndex:(addToPlistArr.count-1)];
                }
            
                if ([addToPlistArr writeToFile:plistPath atomically:YES]) {
                    NSLog(@"将数组保存为属性列表文件成功!!");
                }else{
                    NSLog(@"将数组保存为属性列表文件不成功");
                }
            }break;
            case 1:{
                [addToPlistArr addObject:addDict];
            
                if ([addToPlistArr writeToFile:plistPath atomically:YES]) {
                    NSLog(@"将数组保存为属性列表文件成功!!");
                }else{
                    NSLog(@"将数组保存为属性列表文件不成功");
                }
            }break;
            case 2:{
                 //文件夹下,不存在plist文件  ❤️❤️❤️直接添加,会先创建plist文件❤️❤️❤️
                [addToPlistArr addObject:addDict];
            
                if ([addToPlistArr writeToFile:plistPath atomically:YES]) {
                    NSLog(@"将数组保存为属性列表文件成功!!");
                }else{
                    NSLog(@"将数组保存为属性列表文件不成功");
                }
            }break;
            default:
            break;
        }
    

    } else {
        //AlertView里没有输入任何信息
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        hud.mode = MBProgressHUDModeText;
        hud.label.text = @"选择默默无闻,分数不保存";
        hud.margin = 10.f;
        hud.offset = CGPointMake(0, -60.f);
        hud.removeFromSuperViewOnHide = YES;
        [hud hideAnimated:YES afterDelay:1.5f];
    
    }
    //NSLog(@"%ld",buttonIndex);
}


逻辑判断

判断文件夹路径下是否有“RankList.plist”文件:

  • 不包含:
    创建“RankList.plist”文件(数组:Array),并添加一个对象信息(字典:Dictionary)

  • 包含:存储的数据 排序(积分:_jifenStr)

    • 大于 “RankList.plist”文件(数组:Array)中任一元素(对象信息)
      数据(Dictionary):
      直接插入相应的位置。

      若插入数据后,若数组个数超过限制(10个):需要移除最后一个元素。

    • 不大于 “RankList.plist”文件(数组:Array)中任一元素(对象信息)
      数据(Dictionary):

      • 数组个数 超过限制(10个):不做处理

      • 数组个数 不超过限制(10个):直接添加到数组最后面






goyohol's essay

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

推荐阅读更多精彩内容

  • //将NSData转化为NSString NSString* str = [[NSString alloc]...
    吾是小马哥阅读 2,430评论 0 3
  • //将NSData转化为NSString NSString* str = [[NSString alloc] in...
    脱脱夫斯基阅读 1,119评论 0 52
  • 课程要点:plist文件的新建与读取给UITableView设置变化的值单元格的删除、插入及刷新 plist...
    shiwuoo阅读 2,603评论 0 6
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,107评论 29 470
  • 四月五月去看了idol两场演出,回来后就有了好多愿望:想看idol很多场的演出,想买idol的专辑,想去idol喜...
    唐可竹阅读 211评论 0 0