线程同步问题-利用block和递归

需求:利用HealthKit从iOS系统获取最近一周运动步数

由于使用的HealthKit接口是在子线程执行的, 若使用for循环遍历查询多天数据存入数组的话会由于多线程不同步的原因导致排序混乱
一种思路就是给查询出的每一天的数据分配一个日期的id, 查询结束后再根据日期给数组排序(怎么判断所有线程执行完?用KVO监听数组个数?觉得这种有点麻烦还没有实现,只是同事给的一个建议)
由于系统提供的方法有block回调, 于是想到用block回调, 封装一个递归方法, 利用递归实现线程同步和循环查询
最终截图:


IMG_0040.PNG

封装的递归方法:

//利用当前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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,512评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,488评论 11 349
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,995评论 25 709
  • 不知从何时起,吃妈妈亲手做的饭的日子少了,对大多数如同我一样求学在外的学子来说,这逐渐变为一种奢侈。妈妈做的饭味道...
    不争先生阅读 5,489评论 0 1
  • 姓名:陆振村~公司:浙江均泰建设有限公司 【日精进打卡第22天】 【知~学习】 《六项精进》大纲1遍 共24遍 《...
    陆振村阅读 1,270评论 0 0

友情链接更多精彩内容