iOS 如何创建一个线程,要求可以一直工作,不会执行一次就结束
2016-06-06 20:54
766 查看
http://blog.csdn.net/hu_songsong/article/details/12845391
http://www.dreamingwish.com/frontui/article/default/ios-multithread-program-runloop-the.html
如何创建一个线程,要求可以一直工作,不会执行一次就结束。
@synthesize name;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadFunc) object:nil];
[thread start];
}
static bool over = NO;
- (void)threadFunc
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
while (YES) {
@synchronized(name){
name = @"Frank";
[NSThread sleepForTimeInterval:2];
if ([NSThread isMultiThreaded]) {
NSLog(@"%@ isMultiThreaded",name);
}
if (over) {
break;
}
}
}
[pool release];
}
.结束这个线程:
a)break;
b)[thread cancel]
NSRunloop
一个run loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run
loop的目的是使你的线程在有工作的时候工作,没有的时候休眠。NSRunloop可以保持一个线程一直为活跃状态,不会马上销毁。
在多线程中使用定时器必须开启Runloop,因为只有开启Runloop保持线程为活跃状态,定时器才能运行正常。
有两种方法可以让run loop处理事件之前退出:
给run loop设置超时时间
通知run loop停止
如果可以配置的话,推荐使用第一种方法。指定一个超时时间可以使run loop退出前完成所有正常操作,包括发送消息给run loop观察者。
使用CFRunLoopStop来显式的停止run loop和使用超时时间产生的结果相似。Run loop把所有剩余的通知发送出去再退出。与设置超时的不同的是你可以在无条件启动的run loop里面使用该技术。
尽管移除run loop的输入源和定时器也可能导致run loop退出,但这并不是可靠的退出run loop的方法。一些系统例程会添加输入源到run loop里面来处理所需事件。因为你的代码未必会考虑到这些输入源,这样可能导致你无法没从系统例程中移除它们,从而导致退出run loop。
http://www.dreamingwish.com/frontui/article/default/ios-multithread-program-runloop-the.html
如何创建一个线程,要求可以一直工作,不会执行一次就结束。
@synthesize name;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadFunc) object:nil];
[thread start];
}
static bool over = NO;
- (void)threadFunc
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
while (YES) {
@synchronized(name){
name = @"Frank";
[NSThread sleepForTimeInterval:2];
if ([NSThread isMultiThreaded]) {
NSLog(@"%@ isMultiThreaded",name);
}
if (over) {
break;
}
}
}
[pool release];
}
.结束这个线程:
a)break;
b)[thread cancel]
NSRunloop
一个run loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run
loop的目的是使你的线程在有工作的时候工作,没有的时候休眠。NSRunloop可以保持一个线程一直为活跃状态,不会马上销毁。
在多线程中使用定时器必须开启Runloop,因为只有开启Runloop保持线程为活跃状态,定时器才能运行正常。
- (void)viewDidLoad { [super viewDidLoad]; //self.view.backgroundColor=[UIColor blueColor]; [self performSelectorInBackground:@selector(multithread) withObject:nil]; } -(void)multithread { NSLog(@"HE"); [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timeAction) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop]run]; } -(void)timeAction { NSLog(@"HELLO"); }
1.3.4 退出Run Loop
有两种方法可以让run loop处理事件之前退出:给run loop设置超时时间
通知run loop停止
如果可以配置的话,推荐使用第一种方法。指定一个超时时间可以使run loop退出前完成所有正常操作,包括发送消息给run loop观察者。
使用CFRunLoopStop来显式的停止run loop和使用超时时间产生的结果相似。Run loop把所有剩余的通知发送出去再退出。与设置超时的不同的是你可以在无条件启动的run loop里面使用该技术。
尽管移除run loop的输入源和定时器也可能导致run loop退出,但这并不是可靠的退出run loop的方法。一些系统例程会添加输入源到run loop里面来处理所需事件。因为你的代码未必会考虑到这些输入源,这样可能导致你无法没从系统例程中移除它们,从而导致退出run loop。
相关文章推荐
- iOS开发(OC)——根据时间戳转换成不同的显示
- iOS 直播-获取音频(视频)数据
- ios开发中的一些小技巧
- IOS集合视图
- 如何给Label加背景图片
- iOS layout机制相关方法
- IOS 字符串中去除特殊符号 stringByTrimmingCharactersInSet
- 一篇ios开发学习的文章
- iOS中的星星评分功能视图实现
- iOS 获取崩溃信息
- iOS音频播放的几种方式,打开后台模式的音乐播放、使用AVAudioPlayer播放音乐、播放指定的音频文件、注册音频文件
- IOS开发最新的公告关于保存缓存到Documents 发布被拒的解决办法
- iOS开发小技巧--获取自定义的BarButtonItem中的自定义View的方法(customView)
- ios进阶--Autolayout 之第三方框架--Masonry
- iphone6P上字体变大iOS适配ios6P
- iOS 获取当前正在显示的ViewController或者当前的PresentedViewController
- iOS开发runtime实现任意界面跳转
- ios进阶--Autolayout 之VFL语言
- ios进阶--Autolayout
- GRMustache的使用(HTML模板渲染工具)For iOS