iOS计步器功能实现之CoreMotion如何读取数据(二)

上篇文章写了如何简单实现记步功能,但是作为一款app我们不仅仅要实现记步功能,还要对记录的数据进行整理,更好的呈现给用户,发送给后台,保存用户的运动信息等。在上篇文章中提到过获取用户运动信息的方法如下:

-(void)gotoGetStepCountFrom:(NSDate *)fromeDate to:(NSDate *)toDate CallBack:(void(^)(NSString *steps))callBack{   //根据起始期,终止日期进行查询步行数量



    //判断记步功能
    if ([CMPedometer isStepCountingAvailable]) {
        [[APP_DELEGATE sharedPedometer] queryPedometerDataFromDate:fromeDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"error====%@",error);
            }else {
                //                NSLog(@"AAA步数====%@",pedometerData.numberOfSteps);
                //                NSLog(@"AAA距离====%@",pedometerData.distance);
                NSString *numberOfSteps = [NSString stringWithFormat:@"%@",pedometerData.numberOfSteps];
                callBack(numberOfSteps);
            }
        }];
    }else{
        NSLog(@"记步功能不可用");
    }


}

知道了获取数据的方法,什么时候获取数据比较合适呢,可能有的朋友会说加一个定时器定时去获取,如果有这种想法的建议看一下iphone后台机制的 相关博客,由于iphone在程序进入后台后过一段时间就会被挂起,如果内存不够用的话还会被kill掉。所以定时获取数据的方法基本不可用了。因为在程序挂起,或者被杀死后app中的获取运动数据的方法就不再被执行了,也就获取不到相关的数据了。那该如何去处理呢。后来经过一个早上的思索逐渐有了思路。由于用户想看的数据的以后,app是启动的,那么我们就可以在用户在查看的那个页面把数据给取出来。由于计步器的运动数据是按照时间轴,步数来存取的。所以我们可以根据用户的需求去获取数据,并加以整理。例如我们这里获取的用户数据是小时为单位的。我就可以获取每个小时间隔的步行数。假如在ShowViewController这个页面用户可以看到呈现给自己的用户运动数据。这个地方我一般放在viewwillAppear这个方法里来实现。

 NSDate *lastSaveDate=[NSUSER_DEFAULTS objectForKey:@"lastSaveDate"];  // 获取上次保存的时间

        NSDate *currentSaveDate =[self dateShiftAccurateToHours:[NSDate date]];

        if (lastSaveDate) {

            //        [self getWalkDataAndSaveWithAccurateHourDate:currentSaveDate];
            [self getWalkDataAndSendToRemoteServerWithAccurateHourDate:currentSaveDate];

        }else{


            NSDate *lastSaveDate = [NSDate dateWithTimeInterval:-60*60 sinceDate:currentSaveDate];
            [APP_DELEGATE gotoGetStepCountFrom:lastSaveDate to:currentSaveDate CallBack:^(NSString *steps) {
                if (![steps isEqualToString:@"不可用"]) {




                    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                    [dateFormatter setDateFormat:@"YYYY-MM-dd"];
                    NSString *walkDate = [dateFormatter stringFromDate:currentSaveDate];
                    [dateFormatter setDateFormat:@"HH"];
                    NSString *walkTime = [dateFormatter stringFromDate:currentSaveDate];
                    NSArray *array=@[@{@"walkCount":steps,@"walkDate":walkDate,@"walkTime":walkTime}];

                    NSDictionary *parmeters =@{@"records":array};

                    [SettingStepsModel requestBatchSendStepCountsWithURL:URL_BATCHSENDSTEPCOUNTS parmeters:parmeters block:^(id responseObject, id dataArray) {  // 这个是将获取的数据发送到后台服务器

                        DLog(@"responseObject %@,dataArray %@",responseObject,dataArray);

                        [NSUSER_DEFAULTS setObject:currentSaveDate forKey:@"lastSaveDate"];

                    }];

                    //                //  获取前一个时记步并且保存数据库
                    //                [self insertStepCountWithCachesWithHour:1 steps:steps WithAccurateHourDate:currentSaveDate];

                }
            }];

        }
-(void)getWalkDataAndSendToRemoteServerWithAccurateHourDate:(NSDate *)currentDate{


    NSDate *tempLastSaveDate=[NSUSER_DEFAULTS objectForKey:@"lastSaveDate"];

    __block NSDate *lastSaveDate =[self dateShiftAccurateToHours:tempLastSaveDate];
    int hourInterval = [currentDate timeIntervalSinceDate:lastSaveDate]/(60*60);//距离今天有多少小时
    NSDate*nextHourSaveDate=nil;
    //    保存时间

    if(hourInterval>=1)
    {
        if (hourInterval>24*4) {  //判断是否四天没有进入这个页面了。
            hourInterval=24*4;
        }

        NSMutableArray *walkDataArray = [[NSMutableArray alloc] init];
        for(int i=1 ; i <= hourInterval ; i++)
        {

            NSTimeInterval  interval =60*60; //1小时
            nextHourSaveDate = [NSDate dateWithTimeInterval:interval sinceDate:lastSaveDate];

            [APP_DELEGATE gotoGetStepCountFrom:lastSaveDate to:nextHourSaveDate CallBack:^(NSString *steps) {
                if (![steps isEqualToString:@"不可用"]) {

                    NSDate * saveDate = nextHourSaveDate;


                    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                    [dateFormatter setDateFormat:@"YYYY-MM-dd"];
                    NSString *walkDate = [dateFormatter stringFromDate:saveDate];
                    [dateFormatter setDateFormat:@"HH"];
                    NSString *walkTime = [dateFormatter stringFromDate:saveDate];
                    NSDictionary *dic=@{@"walkCount":steps,@"walkDate":walkDate,@"walkTime":walkTime};
                    [walkDataArray addObject:dic];

                    [NSUSER_DEFAULTS setObject:nextHourSaveDate forKey:@"lastSaveDate"];
                    lastSaveDate = [NSDate dateWithTimeInterval:interval sinceDate:lastSaveDate];

                }
            }];

        }

        NSArray *walkData = [walkDataArray copy];


        NSDictionary *parmeters =@{@"records":walkData};

        [SettingStepsModel requestBatchSendStepCountsWithURL:URL_BATCHSENDSTEPCOUNTS parmeters:parmeters block:^(id responseObject, id dataArray) {

            DLog(@"responseObject %@,dataArray %@",responseObject,dataArray);

        }];

    }




}

通过上面的方法大家可以发现,通过lastSaveDate和currentDate 这两个时间的比较,来判断是否去获取用户的运动数据,循环多少次去获取用户的运动数据。如果小于一个小时,那么后面的方法就不会去执行。所以用户不用去担心循环多次执行造成手机资源的消耗。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值