Cocoa Touch:App运行机制 NSRunLoop, KVC, KVO, Notification

Posted 好时光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cocoa Touch:App运行机制 NSRunLoop, KVC, KVO, Notification相关的知识,希望对你有一定的参考价值。

 

runloop相关基础类定义

1、日期对象 NSDate, NSDateFormatter

    NSDate的实例表示一个日期,线程可以借助于NSDateFormatter的实例实现NSDate对象和NSString对象的相互转换。

// date方法返回的就是当前时间(now)  
 NSDate *date = [NSDate date];  
// now:  11:12:40  
// date: 11:12:50  
 date = [NSDate dateWithTimeIntervalSinceNow:10];//返回当前时间10秒后的时间  
 // 从1970-1-1 00:00:00开始  
 date = [NSDate dateWithTimeIntervalSince1970:10];//返回1970-1-1 00:00:00时间10秒后的时间  
 // 随机返回一个比较遥远的未来时间  
 date = [NSDate distantFuture];  
 // 随机返回一个比较遥远的过去时间  
 date = [NSDate distantPast];  
// 返回1970-1-1开始走过的毫秒数  
 NSTimeInterval interval = [date timeIntervalSince1970];  
 // 跟其他时间进行对比  
 NSDate *date2 = [NSDate date];  
 // 返回比较早的那个时间  
 [date earlierDate:date2];  
 // 返回比较晚的那个时间  
 [date laterDate:date2];  

//获取两个时间的时间差  
[date1 timeIntervalSinceDate date2]; 

NSDate *date = [NSDate date];  
 // 2013-04-07 11:14:45  
 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
 // HH是24进制,hh是12进制  
 formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";  
 // formatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"] autorelease];  
 NSString *string = [formatter stringFromDate:date];  
 NSLog(@"%@", string);  
 // 返回的格林治时间  
 NSDate *date2 = [formatter dateFromString:@"2010-09-09 13:14:56"];  

2、定时器 NSTimer

    可以使用NSTimer的实例在一个NSRunLoop实例中注册一个定时事件源,并且把这个timer实例注册为这个事件的观察者。也就是说一个定时器和定时事件是绑定的,我们将在下文中结合runloop讲解。

 

事件循环对象NSRunLoop

1、run loop概念

    NSRunLoop类封装了线程进入事件循环的过程,一个runloop实例就表示了一个线程的事件循环。

    处于事件循环的线程接收的事件源有两种:input source 和 timer source。线程调用便利函数 [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:] 在创建一个NSTimer实例的同时,以默认模式Default mode在当前线程的run loop中注册了一个timer source,并且把新创建的timer添加到run loop中,作为事件的观察者。

    不过每个线程在创建定时器的时候不立刻把它添加到run loop中,只需要调用 [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats:],然后再使用[NSRunloop currentRunLoop]获取对应的事件循环对象,再调用 [runloop addTimer] 方法,那么就会注册一个定时事件,在这个定时器失效之前,当前线程就不会直接终止。或者可以调用 [[NSTimer alloc]  initWithFireDate:interval:target:selector:userInfo:repeats: ]指定一个定时器的开始时间。

2、定时器生命周期控制

    使用定时器中的fire方法和invalidate方法来控制一个timer的声明周期,对于不断重复的timer来说,就需要这么做。

3、run loop mode类型

 

 

KV监听机制

    Cocoa开发框架内置通知机制,可以实现数据改变后对每个观察者的通知。

 

KVC 键值编码

KVO 键值监听

 

在什么场景下需要KVC?最简单的一种应用场景,如果一个控件的属性被声明为@property(nonatomic,readonly)只读,那么就只能通过KVC去修改这个属性,比如当我们需要用自定义tabBar替换UITabBarController中的原始tabBar的时候。

 

以上是关于Cocoa Touch:App运行机制 NSRunLoop, KVC, KVO, Notification的主要内容,如果未能解决你的问题,请参考以下文章

《从零开始学Swift》学习笔记(Day 66)——Cocoa Touch设计模式及应用之通知机制

《从零开始学Swift》学习笔记(Day 66)——Cocoa Touch设计模式及应用之通知机制

cocoa 和 cocoa touch的区别

UI - Cocoa Touch框架

《从零开始学Swift》学习笔记(Day 64)——Cocoa Touch设计模式及应用之目标与动作

如何使用 Xcode 4 在 Cocoa Touch 单元测试包中创建应用程序测试?