需求:利用HealthKit从iOS系统获取最近一周运动步数
由于使用的HealthKit接口是在子线程执行的, 若使用for循环遍历查询多天数据存入数组的话会由于多线程不同步的原因导致排序混乱
一种思路就是给查询出的每一天的数据分配一个日期的id, 查询结束后再根据日期给数组排序(怎么判断所有线程执行完?用KVO监听数组个数?觉得这种有点麻烦还没有实现,只是同事给的一个建议)
由于系统提供的方法有block回调, 于是想到用block回调, 封装一个递归方法, 利用递归实现线程同步和循环查询
最终截图:
封装的递归方法:
//利用当前date和当前weekday获取当前周的运动步数
-(void)recursionGetSteps:(NSDate *)date muArray:(NSMutableArray *)muArray weekday:(NSInteger)weekday{
[[HealthKitManage shareInstance] getStepOfDate:date Count:^(double value, NSError *error) {
NSString *step =[NSString stringWithFormat:@"%zd",(NSInteger)value];
NSLog(@"这里这里这里这里%zd--%@",weekday,[NSThread currentThread]);
[muArray addObject:step];
NSLog(@"%@",muArray[0]);
self.weekSteps = muArray;
//若数据读取结束跳出递归,回主线程刷新UI
if (self.weekSteps.count == weekday) {
dispatch_sync(dispatch_get_main_queue(), ^{
self.weekSteps = (NSMutableArray *)[[muArray reverseObjectEnumerator] allObjects];
[self configUI];
});
}else{
NSDate *preDate = [HealthKitManage preDateOfDate:date];
[self recursionGetSteps:preDate muArray:muArray weekday:weekday];
}
}];
}
注: HealthKitManage是对HealthKit请求授权和数据查询封装好的一个工具类
或许有更好的实现多线程同步读取数据的方法, 欢迎留言相互交流.demo有空会放github