美文网首页iOS学习开发
排行榜实现 (Plist文件)

排行榜实现 (Plist文件)

作者: goyohol | 来源:发表于2017-08-26 17:24 被阅读42次

在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

相关文章

网友评论

    本文标题:排行榜实现 (Plist文件)

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