直接上代碼:一看你就懂了。
#import "ViewController.h"
@interface ViewController ()
/** 注釋 */
//@property (nonatomic, strong) pthread_t thread;
@end
@implementation ViewController
#pragma mark ----------------------
#pragma mark Events
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// [self observer];
// [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(task) userInfo:nil repeats:YES];
[NSThread detachNewThreadSelector:@selector(task) toTarget:self withObject:nil];
}
- (IBAction)sourceBtnClick:(id)sender
{
NSLog(@"%s",__func__);
}
#pragma mark ----------------------
#pragma mark
-(void)task
{
NSLog(@"%s",__func__);
// [NSRunLoop currentRunLoop] runUntilDate:[];
}
-(void)observer
{
//1.創(chuàng)建監(jiān)聽者
/*
第一個參數(shù):怎么分配存儲空間
第二個參數(shù):要監(jiān)聽的狀態(tài) kCFRunLoopAllActivities 所有的狀態(tài)
第三個參數(shù):時候持續(xù)監(jiān)聽
第四個參數(shù):優(yōu)先級 總是傳0
第五個參數(shù):當狀態(tài)改變時候的回調(diào)
*/
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
/*
kCFRunLoopEntry = (1UL << 0), 即將進入runloop
kCFRunLoopBeforeTimers = (1UL << 1), 即將處理timer事件
kCFRunLoopBeforeSources = (1UL << 2),即將處理source事件
kCFRunLoopBeforeWaiting = (1UL << 5),即將進入睡眠
kCFRunLoopAfterWaiting = (1UL << 6), 被喚醒
kCFRunLoopExit = (1UL << 7), runloop退出
kCFRunLoopAllActivities = 0x0FFFFFFFU
*/
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"即將進入runloop");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"即將處理timer事件");
break;
case kCFRunLoopBeforeSources:
NSLog(@"即將處理source事件");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"即將進入睡眠");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"被喚醒");
break;
case kCFRunLoopExit:
NSLog(@"runloop退出");
break;
default:
break;
}
});
/*
第一個參數(shù):要監(jiān)聽哪個runloop
第二個參數(shù):觀察者
第三個參數(shù):運行模式
*/
CFRunLoopAddObserver(CFRunLoopGetCurrent(),observer, kCFRunLoopDefaultMode);
//NSDefaultRunLoopMode == kCFRunLoopDefaultMode
//NSRunLoopCommonModes == kCFRunLoopCommonModes
}
@end