美文网首页
GCD的一些高级用法

GCD的一些高级用法

作者: 精诚所至金石为开_1b1f | 来源:发表于2021-02-27 18:58 被阅读0次

好吧,这周比较忙,没更新博客,之前的有些忘记了,先说说对项目架构的理解吧。

目前在项目中我使用的是MVC架构,后期可能会考虑转化为MVP。

        mvp的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。

                                                                                                                            --------------- 百度百科

我所理解的MVP,这个P不是Presenter,而是Protocol,面向协议编程(POP),但是又不是纯纯的POP,杂糅吧,我觉得面向协议,思路更为的清晰,后期维护更为的简单便捷,阅读成本更低,而且,针对流程化元素很多的情况,感觉面向协议就是为了流程而生。。

再说说针对目前项目中多请求的情况,虽然现在没有解决问题(至少目前没有),但是我觉得已经理清楚了其中的思路,简单来说还是针对GCD的一些高级应用吧。

下面来说说leave 和enter (大都使用在等待请求数据回来之后刷新UI,循环中使用的比较多):

1、先创建对象

dispatch_group_t group = dispatch_group_create();

  2、循环执行网络请求

dispatch_group_enter(group);

for(inti =0; i < self.testAry.count; i++) {       

            [NetRequest postWithBasicParameters:dict success:^(NSDictionary *arg)  {           

                            //网络请求成功                            

                            dispatch_group_leave(group);       

            } failure:^(NSString *arg) {           

                            //网络请求失败                        

                            dispatch_group_leave(group);       

             }];   

}

  需要注意的地方:这里要注意的是无论是网络请求失败还是成功,都要调用结束方法,不然会阻塞线程。

  3、等所有循环结束后开始刷新UI

dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

        .................

        [self.tableView reloadData];  // 这个注意需要在住主线程中刷新UI

});

之后再来说说GCD的信号量(控制单次的进程等待的方法。):

  信号量是用于多线程同步的,跟锁不一样的是,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务 并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。

  而对于锁来说,锁住的资源无法被其余的线程访问,从而阻塞线程而实现线程同步。

// 创建信号量

参数:信号量的初值,如果小于0则会返回

NULLdispatch_semaphore_create(信号量值)

// 等待降低信号量

dispatch_semaphore_wait(信号量,等待时间)--------> 这是一个信号量减一的过程,小于等于0,就等待。。

//提高信号量

dispatch_semaphore_signal(信号量)                    ----------> 这是一个信号量加一的过程,大于0就不阻塞线程

  3、举例

-(void)dispatchSignal{

                dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);    // 参数代表并行的进程数目

                dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);   

                // task1

                dispatch_async(queue, ^{       

                        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);       

                        NSLog(@"run task 1");       

                        sleep(1);       

                        NSLog(@"complete task 1");       

                        dispatch_semaphore_signal(semaphore);        

                });

                // task2

                dispatch_async(queue, ^{       

                        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);       

                        NSLog(@"run task 2");       

                        sleep(1);       

                        NSLog(@"complete task 2");       

                        dispatch_semaphore_signal(semaphore);        

                });

                //task 3

                dispatch_async(queue, ^{       

                        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);       

                        NSLog(@"run task 3");       

                        sleep(1);       

                        NSLog(@"complete task 3");       

                        dispatch_semaphore_signal(semaphore);        

                }); }

相关文章

  • GCD

    iOS多线程 Swift4 GCD深入解析swift GCD 的一些高级用法GCD 之线程组(Dispatch G...

  • dispatch_group和dispatch_barrier的

    前天被人问到使用GCD做依赖的用法,结果完全答不上来,下来之后就搜索了一下GCD的高级用法,发现自己对于GCD的掌...

  • GCD的一些高级用法

    好吧,这周比较忙,没更新博客,之前的有些忘记了,先说说对项目架构的理解吧。 目前在项目中我使用的是MVC架构,后期...

  • GCD高级用法

    文章链接:https://github.com/ChenYilong/ParseSourceCodeStudy/b...

  • GCD的高级用法

    一次性执行(dispatch_once_t) 实际开发中有时我们需要某个方法只执行一次,而且要保证线程是安全的,那...

  • swift GCD 的一些高级用法

    信号量 之前遇到一个问题,一个请求需要在另一个请求获得的参数。这个时候最开始的办法是把第二个请求写在第一个请求的回...

  • GCD 高级用法总结

    延时执行三种方法 并行/串行/主队列综合练习 队列组 两个网络请求同步问题

  • Swift 3 - GCD高级用法

    GCD是Apple开发的一个多核编程的解决方法,基本概念就是dispatch queue(调度队列),queue是...

  • 05GCD高级用法

    GCD用的比较多的方法,高级用法注意事项 目的:实现一件事情做完,再做下一件事情,确保函数的执行周期。 GCD 的...

  • 16.GCD高级用法

    信号量 管理对资源的并发访问,信号量内部有一个可以原子递增或递减的值,如果有一个操作尝试减少信号量的值,使其小于0...

网友评论

      本文标题:GCD的一些高级用法

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