ios线程的五种使用方式
2016-03-31 11:23
302 查看
//第一种方式 手动创建并启动
NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(method) object:nil];
[t start];
//第二种方式 类方法
[NSThread detachNewThreadSelector:@selector(method) toTarget:self withObject:nil];
//第三种方式 类方法
[self performSelectorInBackground:@selector(method) withObject:nil];
//第四种方式 block 语法
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
//会开启一个多线程,调用block
[operationQueue addOperationWithBlock:^{
for (int i=0; i<50; i++) {
NSLog(@"多线程:%d", i);
}
}];
//第五种 线程队列(线程池)
NSOperationQueue *operationQueue2 = [[NSOperationQueue alloc] init]; //相当于一个线程池,里面可以放很多线程,这个线程池管理多个线程的调度,可以给线程设置优先级,并发数
operationQueue2.maxConcurrentOperationCount = 1; //设置最大并发数量(并发=同时进行)
//创建线程
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1) object:nil];
//设置线程的优先级
[operation1 setQueuePriority:NSOperationQueuePriorityVeryLow];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1) object:nil];
[operation2 setQueuePriority:NSOperationQueuePriorityVeryHigh];
//将线程添加到线程池
[operationQueue2 addOperation:operation1];
[operationQueue2 addOperation:operation2];
//----------------------回到主线程--------------------------------
//在多线程中可能加载数据,加载完了之后要刷新ui, ui必须在主线程上面操作,在多线程的方法中这样调用
[self performSelectorOnMainThread:@selector(thread1) withObject:nil waitUntilDone:YES];
//-----------------第六种线程的使用方式--------------
//这个函数是C的函数,字符串test也要用C里面的字符串,是不带@符号的
dispatch_queue_t queue = dispatch_queue_create("test", NULL);
dispatch_async(queue, ^{
for (int i=0; i<50; i++) {
NSLog(@"多线程:%d", i);
}
//回到主线程执行
dispatch_async(dispatch_get_main_queue(), ^{
if ([NSThread isMainThread]) {
NSLog(@"是主线程");
}
});
});
iOS代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201302/8aaa9cf8c2296efc0da6b161facce18d.png)
-(void)thread1 {
//这里是开启了一个新的线程,所以新的线程跟主线程脱离关系了,这个里面的内存管理,我们需要自己创建一个自动释放池
//创建自动释放池
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"执行多线程");
[pool release];
}
NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(method) object:nil];
[t start];
//第二种方式 类方法
[NSThread detachNewThreadSelector:@selector(method) toTarget:self withObject:nil];
//第三种方式 类方法
[self performSelectorInBackground:@selector(method) withObject:nil];
//第四种方式 block 语法
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
//会开启一个多线程,调用block
[operationQueue addOperationWithBlock:^{
for (int i=0; i<50; i++) {
NSLog(@"多线程:%d", i);
}
}];
//第五种 线程队列(线程池)
NSOperationQueue *operationQueue2 = [[NSOperationQueue alloc] init]; //相当于一个线程池,里面可以放很多线程,这个线程池管理多个线程的调度,可以给线程设置优先级,并发数
operationQueue2.maxConcurrentOperationCount = 1; //设置最大并发数量(并发=同时进行)
//创建线程
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1) object:nil];
//设置线程的优先级
[operation1 setQueuePriority:NSOperationQueuePriorityVeryLow];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1) object:nil];
[operation2 setQueuePriority:NSOperationQueuePriorityVeryHigh];
//将线程添加到线程池
[operationQueue2 addOperation:operation1];
[operationQueue2 addOperation:operation2];
//----------------------回到主线程--------------------------------
//在多线程中可能加载数据,加载完了之后要刷新ui, ui必须在主线程上面操作,在多线程的方法中这样调用
[self performSelectorOnMainThread:@selector(thread1) withObject:nil waitUntilDone:YES];
//-----------------第六种线程的使用方式--------------
//这个函数是C的函数,字符串test也要用C里面的字符串,是不带@符号的
dispatch_queue_t queue = dispatch_queue_create("test", NULL);
dispatch_async(queue, ^{
for (int i=0; i<50; i++) {
NSLog(@"多线程:%d", i);
}
//回到主线程执行
dispatch_async(dispatch_get_main_queue(), ^{
if ([NSThread isMainThread]) {
NSLog(@"是主线程");
}
});
});
iOS代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201302/8aaa9cf8c2296efc0da6b161facce18d.png)
-(void)thread1 {
//这里是开启了一个新的线程,所以新的线程跟主线程脱离关系了,这个里面的内存管理,我们需要自己创建一个自动释放池
//创建自动释放池
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"执行多线程");
[pool release];
}
相关文章推荐
- CocoaPods的安装使用和常见问题
- 如何使用iOS 开发证书 和 Profile 文件
- iOS 正则表达式(身份证号详细验证和粗略验证两种表示,后期会持续添加)
- ionic集成极光推送插件-iOS
- ios监听静音键和音量键事件
- iOS开发之打电话,发短信,发送邮件
- iOS下JS与原生OC互相调用
- iOS开发-环信单聊实现
- iOS - 自定义启动图
- iOS字符截取(表情汉字)
- 屏幕翻转
- iOS打包pod spec
- iOS Xcode工程目录的 folder 和 group的区别(蓝色和黄色文件夹的区别)
- iOS:按钮连续点击 按钮快速点击 如何处理
- ios开发的编码规范
- NSDictionary 总结 -iOS
- IOS开发之Autolayout——“Content Compression Resistance”和“Content Hugging”
- iOS- Size Class使用教程
- Block - 7
- iOS 不同颜色之分段式圆环,段数不固定