i os NSRunloop 的使用
来源:互联网 发布:淘宝修改差评链接 编辑:程序博客网 时间:2024/05/17 03:40
利用NSRunLoop阻塞NSOperation线程
在使用NSOperationQueue简化多线程开发中介绍了多线程的开发,我这里主要介绍一下使用NSRunLoop阻塞线程。
主要使用在NStimer定时启用的任务或者异步获取数据的情况如socket获取网络数据,要阻塞线程,直到获取数据之后在释放线程。
下面是线程中没有使用NSRunLoop阻塞线程的代码和执行效果:
线程类:
#import <Foundation/Foundation.h>
@interface MyTask : NSOperation {
}
@end
#import "MyTask.h"
@implementation MyTask
-(void)main
{
NSLog(@"开始线程=%@",self);
[NSTimer timerWithTimeInterval:2 target:self selector:@selector(hiandeTime:) userInfo:nil repeats:NO];
}
-(void)hiandeTime:(id)sender
{
NSLog(@"执行了NSTimer");
}
-(void)dealloc
{
NSLog(@"delloc mytask=%@",self);
[super dealloc];
}
@end
线程添加到队列中:
- (void)viewDidLoad
{
[super viewDidLoad];
NSOperationQueue *queue=[[NSOperationQueue alloc] init];
MyTask *myTask=[[[MyTask alloc] init] autorelease];
[queue addOperation:myTask];
MyTask *myTask1=[[[MyTask alloc] init] autorelease];
[queue addOperation:myTask1];
MyTask *myTask2=[[[MyTask alloc] init] autorelease];
[queue addOperation:myTask2];
[queue release];
}
执行结果是:
2011-07-25 09:44:45.393 OperationDemo[20676:1803] 开始线程=<MyTask: 0x4b4dea0>
2011-07-25 09:44:45.393 OperationDemo[20676:5d03] 开始线程=<MyTask: 0x4b50db0>
2011-07-25 09:44:45.396 OperationDemo[20676:1803] 开始线程=<MyTask: 0x4b51070>
2011-07-25 09:44:45.404 OperationDemo[20676:6303] delloc mytask=<MyTask: 0x4b4dea0>
2011-07-25 09:44:45.404 OperationDemo[20676:5d03] delloc mytask=<MyTask: 0x4b50db0>
2011-07-25 09:44:45.405 OperationDemo[20676:6303] delloc mytask=<MyTask: 0x4b51070>
可以看到,根本没有执行NSTimer中的方法,线程就释放掉了,我们要执行
NSTimer中的方法,就要利用NSRunLoop阻塞线程。下面是修改后的代码:-(void)main执行结果如下:
{
NSLog(@"开始线程=%@",self);
NSTimer *timer=[NSTimer timerWithTimeInterval:2 target:self selector:@selector(hiandeTime) userInfo:nil repeats:NO];
[timer fire];
while (!didDisconnect) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
}2011-07-25 10:07:00.543 OperationDemo[21270:1803] 开始线程=<MyTask: 0x4d16380>我们可以使用NSRunLoop进行线程阻塞。
2011-07-25 10:07:00.543 OperationDemo[21270:5d03] 开始线程=<MyTask: 0x4d17790>
2011-07-25 10:07:00.550 OperationDemo[21270:6303] 开始线程=<MyTask: 0x4d17a50>
2011-07-25 10:07:00.550 OperationDemo[21270:1803] 执行了NSTimer
2011-07-25 10:07:00.551 OperationDemo[21270:5d03] 执行了NSTimer
2011-07-25 10:07:00.552 OperationDemo[21270:6303] 执行了NSTimer
2011-07-25 10:07:00.556 OperationDemo[21270:6503] delloc mytask=<MyTask: 0x4d16380>
2011-07-25 10:07:00.557 OperationDemo[21270:6303] delloc mytask=<MyTask: 0x4d17790>
2011-07-25 10:07:00.557 OperationDemo[21270:5d03] delloc mytask=<MyTask: 0x4d17a50>
0 0
- i os NSRunloop 的使用
- NSRunLoop的使用
- IOS NSRunloop 的使用
- NSRunLoop的原理使用
- NSRunLoop的使用场景
- NSRunLoop的使用
- NSRunLoop使用
- oc中NSRunLoop的使用以及提高定时器准确度
- 关于NSRunLoop深入理解和NSTimer的结合使用
- NSRunLoop与代理一起使用遇到的坑
- NSRunLoop的进一步理解
- NSRunLoop的进一步理解
- NSRunLoop的进一步理解
- NSRunLoop的进一步理解
- NSRunloop 的用法
- NSRunLoop的进一步理解
- NSRunloop 的用法
- NSRunloop 的用法
- Linux系统之内核代码分析-- slab.c
- <高质量C>C指针,数组和字符串
- 来看看2014年欧洲LinuxCon大会Linus Torvalds的最佳语录
- 使用where子句过滤表中数据
- vs2005 小问题1
- i os NSRunloop 的使用
- 使用iframe进行框架嵌套的问题
- RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
- JFreeChart在Struts2中实现折线图统计
- C语言编译的过程分析
- 第十一周项目一 输出其他星号图2,3(倒三角)
- NSOperationQueue 简化线程开发 和 队列的优先级
- configure: error: cannot run C compiled programs
- 视频播放相关的网络协议