上篇文章写了如何简单实现记步功能,但是作为一款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 这两个时间的比较,来判断是否去获取用户的运动数据,循环多少次去获取用户的运动数据。如果小于一个小时,那么后面的方法就不会去执行。所以用户不用去担心循环多次执行造成手机资源的消耗。