GCD线程
1.dispatch_group_notify
2.创建 组队列 dispatch_group_t group = dispatch_group_create()
3.创建 操作queue (全局队列)
dispatch_queue_t queue1 = dispatch_get_global_queue
(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
4.任务1(异步执行任务)
dispatch_group_async(group, queue1, ^{ 图片加载方法 }
5.监听得知所有任务完成
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
添加提示框,休眠时间sleep
})
6.休眠时间 sleep
GCD多线程
1.创建一个九宫格,初始化数组
2.串行队列
1)创建串行队列
dispatch_queue_t serialQueue = dispatch_queue_create
("myQueue", DISPATCH_QUEUE_PRIORITY_DEFAULT)
2)执行任务 同步sync 异步async
异步执行队里任务 ,由于是串行队列,所以不会开启新的线程
dispatch_async(serialQueue, ^{ [self loadImage: i];方法 });
3)定义图片路径 NSData
4)获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue()
5)更新UI(同步)
dispatch_sync(mainQueue, ^{ 主线程,显示加载图片 });
3.全局队列(并发队列)
1)创建全局队列
dispatch_queue_t globalQueue = dispatch_get_global_queue
(DISPATCH_QUEUE_SERIAL, 0);
2)异步执行队列任务
dispatch_async(globalQueue, ^{ [self loadImage:i];方法 });
3)定义图片路径 NSData
4)获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue()
5)更新UI(同步)
dispatch_sync(mainQueue, ^{ 主线程,显示加载图片 });
GCD图片切换
1.定义数组存放图片路径,创建imageView
2.图片自定义
_image.contentMode = UIViewContentModeScaleAspectFill
3.创建队列
dispatch_queue_t serialQueue = dispatch_queue_create
("myQueue", DISPATCH_QUEUE_SERIAL);
4.打印线程 [NSThread currentThread]
5.加载图片
多线程资源抢夺
多线程买票
1.定义数组NSMutableArray
初始化数组, 给数组赋值addObjectsFromArray
[_tickets addObjectsFromArray:@[@“1.上铺",@"1.中铺",@"1.下铺"]]
2.(开始卖票 )创建并发队列
3.创建10个线程用于抢票for循环
4.数组中的最后一个元素lastObject
[_tickets lastObject]
5.移除数组中的元素removeLastObject
[_tickets removeLastObject]
6. 锁
方法一:
1)创建 锁 NSLock *_lock
2)nonatomic属性读取的事内存数据(寄存器计算好的结果),atomic保证直接读取寄存器的数据(这样就不会出现一个线程在修改数据,另一个线程读取了修改之前的数据)永远保证同时只有一个线程在访问数据,一个属性 @property(atomic,strong)NSMutableArray *tickets
3)使用时,把资源抢夺部分的代码放到loc和unlock之间, 当一个线程A进入加锁代码后,另一个线程B就无法访问,只有线程A执行完加锁的任务后,线程B才能访问加锁代码
上锁 [_lock lock]
解锁 [_lock unlock]
方法二:
@synchronized(self){ 资源抢夺内容 }
滤镜
1.显示所有滤镜
NSArray *array = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
NSLog(@"%@", array);
2.定义全局变量
CIContext *_context; //CI的上下文
CIImage *_oldImage; //编辑前
CIImage *_newImage; //编辑后
CIFilter *_filter; //滤镜
3.初始化CI上下文
_context = [CIContext contextWithOptions:nil]
4.初始化滤镜
_filter = [CIFilter filterWithName:@“CIColorControls"]
5.加载图片
6.加载进度条slider
7.初始化CIImage,UI->CG->CI
_oldImage = [CIImage imageWithCGImage:[image CGImage]];
8.设置滤镜的输入图片
[_filter setValue:_oldImage forKey:@“inputImage"];
9.饱和度
[_filter setValue:[NSNumber numberWithFloat:sender.value] forKey:@“inputContrast"];
inputSaturation 饱和度 0-2
inputBrightness 亮度 -1-1
inputContrast 对比度 0-2
10.获取滤镜图片,CI->CG->UI
_newImage = [_filter outputImage];
CGImageRef cgImage = [_context createCGImage:_newImage fromRect:[_oldImage extent]];
_imageView.image = [UIImage imageWithCGImage:cgImage];
12.释放CGImage对象
CGImageRelease(cgImage)