队列组

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@property (weak, nonatomic) IBOutlet UIImageView *imageView2;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}

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

{

NSLog(@"touchesBegan");

// 在子线程下载图片

//异步函数+全局并发队列  嵌套异步函数+主队列

//异步函数+全局并发队列

dispatch_async(dispatch_get_global_queue(0, 0), ^{

//

UIImage *image = [self downloadWebImageWithUrlString:@"http://img0.pclady.com.cn/pclady/1508/18/1346699_31.jpg"];

//异步函数+主队列

dispatch_async(dispatch_get_main_queue(), ^{

//返回要下载的图片

self.imageView.image = image;

});

});

// 在子线程下载图片

dispatch_async(dispatch_get_global_queue(0, 0), ^{

//

UIImage *image = [self downloadWebImageWithUrlString:@"http://finance.gucheng.com/UploadFiles_7830/201507/2015071710300340.jpg"];

dispatch_async(dispatch_get_main_queue(), ^{

self.imageView2.image = image;

});

});

}

//

- (void)grouptest

{

// 下载两张图片.等到两张图片都下载完毕之后,合并图片.然后再显示合并之后的图片.

// 创建一个队列组

dispatch_group_t group = dispatch_group_create();

__block UIImage *image1, *image2;

// 在子线程下载,并且放到一个队列组中.

dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{

// 下载第一张图片

image1 = [self downloadWebImageWithUrlString:@"http://img0.pclady.com.cn/pclady/1508/18/1346699_31.jpg"];

});

// 在子线程下载,并且放到一个队列组中.

dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{

image2 = [self downloadWebImageWithUrlString:@"http://finance.gucheng.com/UploadFiles_7830/201507/2015071710300340.jpg"];

});

// 队列组中的任务执行完毕之后的后续操作.

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

// 合并图片

UIImage *image = [self bingImageWithImage1:image1 Image2:image2];

// 显示图片

self.imageView.image = image;

});

}

// 合并图片

- (UIImage *)bingImageWithImage1:(UIImage *)image1 Image2:(UIImage *)image2

{

if (!image1 || !image2) {

return nil;

}

// 开启一个图形上下文

UIGraphicsBeginImageContext(self.imageView.bounds.size);

// 绘制第一张图片

[image1 drawInRect:self.imageView.bounds];

// 绘制第二张图片

[image2 drawInRect:CGRectMake(0, self.imageView.bounds.size.height - 80, self.imageView.bounds.size.width, 80)];

// 获取合并后的图片

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

// 关闭图形上下文

UIGraphicsEndImageContext();

return image;

}

// 下载网络图片的方法

- (UIImage *)downloadWebImageWithUrlString:(NSString *)urlString

{

NSURL *url = [NSURL URLWithString:urlString];

NSData *data = [NSData dataWithContentsOfURL:url];

UIImage *image = [UIImage imageWithData:data];

return image;

}

- (void)test

{

// 队列组. 队列组可以等待组内的任务都执行完毕之后,再执行后续的操作.

// 从右往左解读:先将任务添加到队列中,然后在将队列添加到队列组中.

// 1.创建一个队列组

dispatch_group_t group = dispatch_group_create();

// 往队列组中添加一个任务

dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{

//

NSLog(@"renwu1%@",[NSThread currentThread]);

[NSThread sleepForTimeInterval:3];

});

// 往队列组中添加一个任务

dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{

//

NSLog(@"renwu2%@",[NSThread currentThread]);

[NSThread sleepForTimeInterval:4];

});

// 往队列组中添加一个任务

dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{

//

NSLog(@"renwu3%@",[NSThread currentThread]);

[NSThread sleepForTimeInterval:5];

});

// 当队列组中的任务都执行完毕之后,会发出一个通知,执行下面的方法.

// 参数1: 确定哪一个队列组中的任务执行完毕.

// 参数2: 队列组中的任务执行完毕之后的后续操作需要早那条线程中执行(直接传一个队列)

// 参数3: 需要后续执行的任务

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

NSLog(@"zuihouzhixingde renwu %@",[NSThread currentThread]);

});

}

@end

时间: 2024-10-23 22:09:37

队列组的相关文章

iOS-GCD 队列组的使用

// 1.队列组 dispatch_group_t group = dispatch_group_create(); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 2.下载图片1 __block UIImage *image1 = nil; dispatch_group_async(group, queue, ^{ NSURL *url1 = [NSURL UR

猫猫学iOS(五十一)多线程网络之GCD下载合并图片_队列组的使用

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 合并图片(图片水印)第一种方法 效果 实现: 思路: 1.分别下载2张图片:大图片.LOGO 2.合并2张图片 3.显示到一个imageView身上 // 异步下载 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

iOS多线程开发小demo7 GCD队列组

// DYFViewController.m // 623-08-队列组 // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (weak, nonatomic) IBOutlet UIImageVi

多线程 GCD队列组

//  DYFViewController.m //  623-08-队列组 // //  Created by dyf on 14-6-23. //  Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (weak, nonatomic) IBOutlet UIIma

OC 线程操作 - GCD队列组

队列组两种使用方 /** 新方法 队列组一般用在在异步操作,在主线程写队列组毫无任何作用 */ - (void)GCD_Group_new_group___notify{ dispatch_queue_t queue = dispatch_queue_create("11", DISPATCH_QUEUE_CONCURRENT); dispatch_queue_t globalqueue = dispatch_get_global_queue(0, 0); dispatch_group

GCD线程依赖,GCD队列组,线程监听,线程等待

1.线程监听 有时候经常有这样的需求,AB任务都执行完成之后,刷新界面或者执行其他操作, /** * 队列组 dispatch_group_notify */ - (void)groupNotify { NSLog(@"begin"); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORIT

基础入门_Python-模块和包.Gevent事件/队列/组/池/信号量/子进程?

常用结构: 1.Event类,事件主要用于Greenlet之间的异步通信 e = gevent.event.Event() -> Event 说明: 创建一个信号对象 e.set() -> None 说明: 设置标志位 e.clear() -> None 说明: 清除标志位 e.wait() -> None 说明: 阻塞直至标志位被设置 #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Auth

DS队列--组队列

题目描述 组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用.组队列是是指队列内的元素分组聚集在一起.组队列包含两种命令: 1. ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾. 2. DEQUEUE,表示队列头元素出队 3. STOP,停止操作 建议使用C++自带的队列对象queue,编程更方便 输入 第1行输入一个t(t<=10),表示1个队列中有多少个组 第2行输入一个第1组的元素个数和数值

队列组用于多个网络请求

dispatch_group_t group = dispatch_group_create(); dispatch_queue_t serialQueue = dispatch_queue_create("com.wzb.test.www", DISPATCH_QUEUE_SERIAL); dispatch_group_enter(group); dispatch_group_async(group, serialQueue, ^{ // 网络请求一 [WebClick getDat