多线程之NSOperation
来源:互联网 发布:js基础知识定义变量 编辑:程序博客网 时间:2024/05/24 01:48
// NSOperation 的三种方式,
/**
* 1.NSInvocationOperation
* 注意:
1. 默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作
2. 只有将 NSOperation放到一个 NSOperationQueue中,才会异步执行操作
*/
- (void)InvocationOperation {
// 1.创建操作对象,封装要执行的任务
NSInvocationOperation *operation = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(download)object:nil];
// 2.执行操作(默认情况下,如果操作没有放到queue中,都是同步执行)
[operation start];
}
- (void)download {
NSLog(@"---download---%@",[NSThreadcurrentThread]);
}
/**
* 2.NSBlockOperation
* 注意:
只要 NSBlockOperation封装的操作数 > 1,就会异步执行操作
*/
- (void)blockOperation {
// 1.封装操作
NSBlockOperation *operation = [NSBlockOperationblockOperationWithBlock:^{
NSLog(@"---download1---%@",[NSThreadcurrentThread]); 在主线程中操作
}];
// 不用加入queue中也可以开启线程,这个取决于任务的个数,
[operation addExecutionBlock:^{
NSLog(@"---download2---%@",[NSThreadcurrentThread]);
}];
[operation addExecutionBlock:^{
NSLog(@"---download3---%@",[NSThreadcurrentThread]);
}];
// 2.执行操作
[operation start];
}
PS:还可以监听:
- (void)operationListen {
NSBlockOperation *operation = [NSBlockOperationblockOperationWithBlock:^{
NSLog(@"NSBlockOperation---download---%@",[NSThreadcurrentThread]);
}];
operation.completionBlock = ^{
//下载完图片后想做事情
NSLog(@"NSBlockOperation---download图片完毕---%@",[NSThreadcurrentThread]);
};
NSOperationQueue *queue = [[NSOperationQueuealloc] init];
[queue addOperation:operation];
}
上面两个方式可以跟 NSOperationQueue 一起使用 ,如果不放到 NSOperationQueue 里面的话,会在主线程运行
- (void)operationQueue {
// 1. 封装操作
NSInvocationOperation *operation1 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(download)object:nil];
// 优先级
operation1.queuePriority =NSOperationQueuePriorityVeryHigh;
NSInvocationOperation *operation2 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(run)object:nil];
NSBlockOperation *operation3 = [NSBlockOperationblockOperationWithBlock:^{
NSLog(@"NSBlockOperation---download1---%@",[NSThreadcurrentThread]);
}];
[operation3 addExecutionBlock:^{
NSLog(@"NSBlockOperation---download2---%@",[NSThreadcurrentThread]);
}];
// 2. 创建队列
*queue = [[NSOperationQueuealloc] init];
// 设置依赖 , 1执行完才执行2 ***可以在不同queue中创建依赖关系 ***
[operation2 addDependency:operation1];
//最大并发数,控制同一时间开的最多的线程数 5以内 2 ~ 3
// queue.maxConcurrentOperationCount = 2;
// 3.添加操作到队列中(自动执行操作,自动开启线程)
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
//取消队列的所有操作
// [queue cancelAllOperations];
//
// // 暂停/恢复 no
// [queue setSuspended:YES];
}
- (void)download {
NSLog(@"---download---%@",[NSThreadcurrentThread]);
}
- (void)run {
NSLog(@"---run---%@",[NSThreadcurrentThread]);
}
第三种形式是自定义的,下一篇博客里面会写
- 多线程开发之NSOperation
- 多线程 之 NSOperation
- 多线程 之 NSOperation
- iOS多线程之NSOperation
- iOS多线程之NSOperation
- iOS多线程之NSOperation
- ios多线程之NSOperation
- IOS多线程之NSOperation
- 多线程之NSOperation
- 多线程之NSOperation
- 多线程之-NSOperation
- 多线程之-NSOperation
- 多线程之NSOperation对象
- 多线程之NSOperation(下)
- iOS多线程之NSOperation
- 多线程之NSOperation
- 多线程之NSOperation
- 《多线程之NSOPeration/NSOperationQueue》
- MySQL case when then else end 用法
- 手机号码有效性判断
- 代码注释2016-8-5
- Web Server之处理静态文件
- 连接mysql
- 多线程之NSOperation
- 数组中出现次数超过一半的数字
- File 获取文件名 路径 测试结果
- comment的用法
- Win 编译使用libevent
- JAVA CAS原理深度分析
- Android 图片的三级缓存 及 图片压缩
- compiler
- Centos下二进制方式安装MySQL (Docker-Centos镜像环境)