OC之多线程
来源:互联网 发布:网络搞笑歌曲你是谁 编辑:程序博客网 时间:2024/03/29 12:39
事情太忙碌,直接用OC记录了,以后使用时,再换成Swift
多线程
1、NSThread
-》最基本的创建方式
/** 创建线程第一种方法,需要调用start方法才可以执行 */ NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; thread.name = @"Custom Thread"; [thread start];
-》直接创建,无须手动启动
/** * 创建线程后自动启动 */ [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; /** * 隐式创建并启动线程 */ [self performSelectorInBackground:@selector(run) withObject:nil];
-》其他方法
/** * 获得当前线程 */ NSThread *thread = [NSThread currentThread]; /** * 获得主线程 */ NSThread *mainThread = [NSThread mainThread];-》线程间的通信
/** * 线程间的通信 */ [thread performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:true];
2、GCD(重点,充分利用手机的多核)
-》队列
--》并发队列:dispatch_get_global_queue
--》串行队列:dispatch_queue_create、dispatch_get_main_queue
-》执行方法
--》同步:dispatch_sync
--》异步:dispatch_async
-》线程间的通信
/** * 使用GDC实现线程之间数据传递 */- (void)asyncDownloadImage { // 1、创建并行队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 2、添加任务到队列中 dispatch_async(queue, ^{ NSString *value = @"人生若只如初见"; // 3、将数据传递给主线程 dispatch_async(dispatch_get_main_queue(), ^{ self.textView.text = value; }); });}
-》其他方法
/** * GCD中代码只执行一次 */- (void)once { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"这里只能执行一次,多了我不会执行的!"); });}/** * GCD中的延迟操作 */- (void)delay { NSLog(@"开始执行,%@", [NSThread currentThread]); // 延迟操作 // 延迟时间 dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)); // 全局并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_after(when, queue, ^{ NSLog(@"终于执行到这里了,%@", [NSThread currentThread]); });}
/** * GCD队列组实现下载 */- (void)groupDownloadImage { // 创建队列组 dispatch_group_t group = dispatch_group_create(); // 队列组中执行异步操作 __block UIImage *imageLeft = nil; dispatch_group_async(group, GlobalQueue, ^{ imageLeft = [self imageWithURL:@"http://img1.touxiang.cn/uploads/20121023/23-012600_360.jpg"]; }); // 队列组中执行异步操作 __block UIImage *imageRight = nil; dispatch_group_async(group, GlobalQueue, ^{ imageRight = [self imageWithURL:@"http://img1.touxiang.cn/uploads/20121023/23-012609_92.jpg"]; }); // 队列组异步执行结束通知 dispatch_group_notify(group, MainQueue, ^{ NSLog(@"%@", imageLeft); }); }
3、NSOperation
-》NSInvocationOperation
/** * 通过NSInvocationOperation实现多线程 */- (void)invocationOperation { // 1、创建NSInvocationOperation对象 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run:) object:@"NSInvocationOperation"]; // 2、启动Operation [operation start];}
-》NSBlockOperation
/** * 通过NSBlockOperation实现多线程 */- (void)blockOperation { // 创建NSBlockOperation对象 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ NSThread *thread = [NSThread currentThread]; NSLog(@"通过NSBlockOperation实现多线程, %@", thread); }]; // 在NSBlockOperation对象中封装多个执行操作 // 当存在多个执行操作的时候,会开启多线程,但不是因为调用addExecutionBlock方法而开启多线程的 // NSBlockOperation *operation = [[NSBlockOperation alloc] init]; [operation addExecutionBlock:^{ NSThread *thread = [NSThread currentThread]; NSLog(@"通过NSBlockOperation实现多线程, %@", thread); }]; [operation addExecutionBlock:^{ NSThread *thread = [NSThread currentThread]; NSLog(@"通过NSBlockOperation实现多线程, %@", thread); }]; // 启动操作 [operation start]; // 取消线程操作 // [operation cancel];}
-》NSOperationQueue
/** * 通过NSOperationQueue队列实现多线程 */- (void)operationQueue { // 1、创建NSOperationQueue对象 // 获得新线程队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 获得主线程队列 // NSOperationQueue *queue = [NSOperationQueue mainQueue]; // 获得当前线程队列 // NSOperationQueue *queue = [NSOperationQueue currentQueue]; // 2、创建NSInvocationOperation对象 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run:) object:@"NSInvocationOperation"]; NSInvocationOperation *runOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run:) object:@"NSInvocationOperationRun"]; NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{ NSThread *thread = [NSThread currentThread]; NSLog(@"NSBlockOperation实现多线程, %@", thread); }]; // 设置最大并发数 // queue.maxConcurrentOperationCount = 1; // 取消队列操作 // [queue cancelAllOperations]; // 暂停队列与恢复队列应用在UITableView中,滚动事件时,暂停网络请求,以便提高UI性能 // 暂停队列 // queue.suspended = YES; // 恢复队列 // queue.suspended = NO; // 设置操作依赖,指定执行顺序:表示blockOperation依赖runOperation,blockOperation在runOperation执行后再执行 [blockOperation addDependency:runOperation]; // 3、将操作添加到队列中,自动执行 [queue addOperation:operation]; [queue addOperation:runOperation]; [queue addOperation:blockOperation];}
/** * Operation操作结束监听 */- (void)operationListener { // 创建NSBlockOperation对象 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"NSBlockOperation实现操作监听, %@", [NSThread currentThread]); }]; operation.completionBlock = ^{ NSLog(@"这里难道是线程结束后的回调函数?谁知道呢! %@", [NSThread currentThread]); }; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:operation];}
-》自定义NSOperation
重写main方法,实现自定义NSOperation功能
/** * 自定义Operation * 将所需要的操作写在main方法中 */- (void)main { // 需要自己创建自动释放池。Operation如果是异步操作,将无法访问主线程的自动释放池 @autoreleasepool { // 检测Operation是否被取消,对取消操作做出响应 if (self.isCancelled) { return; } NSURL *url = [NSURL URLWithString:self.uri]; NSData *data = [NSData dataWithContentsOfURL:url]; if (self.isCancelled) { return; } UIImage *image = [UIImage imageWithData: data]; if (self.isCancelled) { return; } if ([self.delegate respondsToSelector:@selector(downloadOperation:didFinishDownload:)]) { dispatch_async(dispatch_get_main_queue(), ^{ [self.delegate downloadOperation:self didFinishDownload:image]; }); } }}
0 0
- OC之多线程
- OC学习之多态初解
- OC之多态
- OC之多态
- OC语法之多态
- oc学习之多态
- android线程之多线程
- OC面向对象之多态
- 面向对象OC之多态
- OC学习笔记之多态
- OC学习笔记之多态
- GroboUtils之多线程测试
- Java学习之多线程
- java基础教程之多线程
- ecl之多线程
- Qt之多线程(一)
- Qt之多线程(二)
- 黑马程序员之多线程
- git上传代码到github
- HDU2047 阿牛的EOF牛肉串
- exploitpack framework
- @Transactional
- 5.Java NIO系列教程之通道之间的数据传输
- OC之多线程
- [Leetcode]Valid Parentheses
- 心得
- 基于VMware的虚拟机资源池实现(下)-运营资源池
- 【难】【DP】计算“skyline”下的最大矩形面积
- wpf inkcanvas customink 毛笔效果
- 应用框架的设计与实现.net平台--内存跨领域组件--内存操作
- Set Matrix Zeroes|leetcode题解
- Centos 7 设置默认启动命令窗口以及网卡设置