利用runloop開啟常駐線程


Runloop中自動釋放池的創建和釋放


第一次創建:啟動runloop


最後一次銷毀:runloop退出的時候


其他時候的創建和銷毀:當runloop即將睡眠的時候銷毀之前的釋放池,重新創建一個新的


runloop在開發中的應用場景:


最長使用的就是開一個常駐線程 (讓一個子線程不進入消亡狀態,等待其他線程發來詳細,處理其他時間)


在子線程中開啟一個定時器


在子線程中進行長期監控


可以控制定時器在特定模式下執行


可以讓某些事件(行為,任務)在特定模式下執行


可以添加Observer監聽runloop的狀態,比如監聽點擊事件(在所有點擊事件之前做一些事情)


總所周知,一條子線程隨著任務的執行完畢就會掛掉,那麼如何保證子線程不掛掉呢?


解決方法:開runloop


以下下是示例代碼


#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong)NSThread *thread;

@end

@implementation ViewController

- (IBAction)creatBtn:(id)sender {

self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(task) object:nil];
[self.thread start];
}

- (IBAction)goonBtn:(id)sender {

//想讓上面開的線程執行完畢後繼續工作,需要做一個線程間的通信
[self performSelector:@selector(task2) onThread:self.thread withObject:nil waitUntilDone:YES];

}

-(void)task
{
NSRunLoop *runloop=[NSRunLoop currentRunLoop];
//為瞭保證runloop不退出
// NSTimer *timer=[NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
//
// [runloop addTimer:timer forMode:NSDefaultRunLoopMode];
NSLog(@"%s",__func__);
[runloop addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[runloop run];

}

-(void)task2
{
NSLog(@"task2-----%@",[NSThread currentThread]);

}

-(void)run
{
NSLog(@"%s",__func__);
}

//

@end

0 個評論

要回覆文章請先登錄註冊