美文网首页
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的一些高级用法

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