java中gcd是什么意思,GCD的一些高级用法

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

目前在项目中我使用的是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、等所有循环结束后开始刷新UIdispatch_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);

}); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值