要求两个异步任务都完成后, 才能回到主线程:dispatch_group_t

需求:两个异步任务都完成后, 回到主线程

/**

1.下载图片1和图片2

2.将图片1和图片2合并成一张图片后显示到imageView上

思考:

* 下载图片 : 子线程

* 等2张图片都下载完毕后, 才回到主线程

*/

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

// 创建一个组

dispatch_group_t group = dispatch_group_create();

// 开启一个任务下载图片1

__block UIImage *image1 = nil;

dispatch_group_async(group, global_queue, ^{

image1 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];

});

// 开启一个任务下载图片2

__block UIImage *image2 = nil;

dispatch_group_async(group, global_queue, ^{

image2 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/b2a9cfc88b7a56cfa59b8d09208fa1fb.jpg"];

});

// 同时执行下载图片1\下载图片2操作

// 等group中的所有任务都执行完毕, 再回到主线程执行其他操作

dispatch_group_notify(group, main_queue, ^{

self.imageView1.image = image1;

self.imageView2.image = image2;

// 合并

UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);

[image1 drawInRect:CGRectMake(0, 0, 100, 100)];

[image2 drawInRect:CGRectMake(100, 0, 100, 100)];

self.bigImageView.image = UIGraphicsGetImageFromCurrentImageContext();

// 关闭上下文

UIGraphicsEndImageContext();

});

//    if (self.log == NO) {

//        NSLog(@"-------touchesBegan");

//        self.log = YES;

//    }

//    static dispatch_once_t onceToken;

//    dispatch_once(&onceToken, ^{

//        NSLog(@"-------touchesBegan");

//    });

}

时间: 2024-10-13 20:40:36

要求两个异步任务都完成后, 才能回到主线程:dispatch_group_t的相关文章

C# 多线程join的用法,等待多个子线程结束后再执行主线程

等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = new Thread[2]; ths[0] = new Thread(Method1); ths[1] = new Thread(Method2); foreach (Thread item in ths) { //首先让所有线程都启动 item.Start(); //试想一下在这里加上item.

如何让UITableView加载完成后更新UI回到主线程

tableView加载完毕后回调的delegate方法: -(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){

iOS8以后UIAlertView和UIActionSheet两种alert页面都将通过UIAlertController来创建

1. Important: UIAlertView is deprecated in iOS 8. (Note that UIAlertViewDelegate is also deprecated.) To create and manage alerts in iOS 8 and later, instead use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert. //UIAlertView和UI

AsyncTask和Handler两种异步方式的实现和区别比较

1  AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l  简单,快捷 l  过程可控 使用的缺点: l  在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 Handler异步实现的原理和适用的优缺点 在Handler 异步实现时,涉及到 Handler, Loo

Android Handler 异步调用修改界面与主线程

在Android编程的过程中,如果在Activity中某个操作会运行比较长的时间,比如:下载文件.这个时候如果在主线程中直接下载文件,会造成Activity卡死的现象:而且如果时间超过5秒,会有ANR报错. 在这种情况下, 可以使用Handler来处理. 涉及到的类主要有:Handler.Thread.Message.MessageQueue.Looper.HandlerThread 如果是针对上面的情况,可以只使用Handler.Message和Thread就可以解决.在Thread中处理下载

better-scroll刷新后才能滑动的解决方案

使用cube-ui时鼠标滚轮无法使用,且老触发无法滑动的bug,我十分困惑,于是分析了scroll组件,发现better-scroll才是关键. 于是我赶紧看了看better-scroll的文档.发现鼠标滚轮是可以开启的.开启之后终于可以愉快的使用鼠标滚轮了. mouseWheel: true,//开启鼠标滚轮 使用better-scroll,在chrome浏览器测试代码,切换手机模拟器之后,就会出现刷新后才能滑动的"bug".这个问题困扰了我半天,上网搜了很久也没有找到很好的解决方案

最新版本MYSQL官网下载地址但是必须要注册后才能下载

因mysql5.0上执行函数不行,决定安装最新版本的mysql,在网上找了些绿色版的,安装总报1067错误,网上的各种方法都试了,就是不行,浪费时间不说,郁闷死了,最后决定去官网,官网上面有msi安装版和绿色版,必须注册下,才能进行下面的操作.因之前绿色版安装老报1067错,决定使用安装版,但是 进入到MSI下载页面(http://dev.mysql.com/downloads/installer/5.6.html) 发现没有X64关键字,没事,你把下图的第二个mysql-installer-w

移动端输入框只有输入文本后才能点击效果

现在手机端的提交按钮很多都是在输入内容后才能提交的,如图: 这是没有输入文本时的效果,当然 下一步 按钮也是不可点击的 这个是是输入文本后的效果,可以进行下一步的操作 这样做对数据提交的正确性有一定的保护,同时也增加了用户体验.其实实现这样的效果逻辑很简单.代码如下: /*如果输入内容就给提交按钮添加样式并且添加跳转链接*/ var btn = $('buttn') function judge(){ var lenght1 = $('#input1').val().length; var le

JFinal保存对象后可以取出主键

JFinal保存对象后可以取出主键,即使这个主键是数据库自增长的. 今天无意中发现,JFinal保存对象后可以把主键取出来,我的数据库表主键都是自增的.比如 Blog blog = getModel(Blog.class);//这里没有存放id  blog.save();  System.out.println(blog.getInt("id"));//这里居然可以取出来. 今天研究的半天,最后在大家的帮助下终于明白是怎么实现的了.Model类的源码如下: public boolean