美文网首页
线程同步问题-利用block和递归

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

作者: geekMole | 来源:发表于2016-08-27 18:13 被阅读75次

需求:利用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

相关文章

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

    需求:利用HealthKit从iOS系统获取最近一周运动步数 由于使用的HealthKit接口是在子线程执行的, ...

  • 网络之美

    线程安全问题----互斥锁和递归锁 互斥锁线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制就是引入互斥锁...

  • 深入浅出node-异步IO

    node在多线程和单线程之间的选择: 利用单线程,原理多线程的死锁、状态同步等问题;利用异步IO,让线程原理阻塞,...

  • iOS-Block的递归调用

    在看线程锁时,无意间看到block的递归调用,之前一直没有想怎么进行block递归调用,这里记录一下。

  • RacScheduler任务队列

    RACScheduler //RAC封装的多线程/单线程block调用接口。特点:可以递归执行blo...

  • OpenMP多线程——Parallel for

    多线程——线程同步 数据竞争问题 线程互斥同步——critical 线程互斥同步——atmoic 线程互斥同步——...

  • 多线程归并排序 go实现

    特性 线程数可以调整 混合使用归并排序的递归版和非递归版实现减少递归调用损耗 线程利用率高 不足:归并排序的mer...

  • Node 简单总结

    Node 单线程,远离多线程死锁,状态同步等问题。 利用异步io,让单线程远离阻塞,以更好的充分利用cpu。需要强...

  • Python 并发编程

    线程 线程调用的两种形式 1 . 直接调用 继承式调用 Thread实例的方法 同步锁 递归锁 递归锁,其中维护一...

  • iOS刨根问底之@synchronized实现同步的原理

    在利用 objc 进行多线程编程时常常遇到同步的问题,这时用的最多的就是NSLock和@synchronized,...

网友评论

      本文标题:线程同步问题-利用block和递归

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