通知:Notification
通知:也是一种观察者模式,与KVO相似.
通知:设计到两个类之间的通信,但是通知不仅可以让一个类观察另外一个类的一个属性值之间的变化,而且还可以扩大信息成为一个通信包.
下面是实例:
实现护士观察孩子醒来.
//
// Child.h
// KVCDemo
//
// Created by 5016 on 13-12-19.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Child : NSObject
@property(assign,nonatomic)NSInteger sleep;
@property(retain,nonatomic)NSString* name;
@property(assign,nonatomic)NSInteger age;
-(Child*)initWithName:(NSString*)name andAge:(NSInteger)age andSleep:(NSInteger)sleep;
@end
//
// Child.m
// KVCDemo
//
// Created by 5016 on 13-12-19.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Child.h"
@implementation Child
@synthesize name = _name,age = _age,sleep=_sleep;
/*使用KVC可以间接访问类私有成员*/
-(Child*)initWithName:(NSString*)name andAge:(NSInteger)age andSleep:(NSInteger)sleep
{
if (self = [super init]) {
[self setValue:name forKey:@"name"];
[self setValue:[NSNumber numberWithInteger:age] forKey:@"age"];
[self setValue:[NSNumber numberWithInteger:sleep] forKey:@"sleep"];
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
}
return self;
}
-(void)timerAction:(NSTimer *)timer
{
self.sleep -- ;
NSLog(@"sleep = %ld",self.sleep);
if (self.sleep == 80) {
//发送一个通知
// [[NSNotificationCenter defaultCenter] postNotificationName:@"wakeUp" object:[NSNumber numberWithInteger:self.sleep]];
//传送字典
NSDictionary *dic = @{@"sleep":[NSNumber numberWithInteger:self.sleep]};
[[NSNotificationCenter defaultCenter] postNotificationName:@"wakeUp" object:[NSNumber numberWithInteger:self.sleep]userInfo:dic];
[timer invalidate];
}
}
-(void)dealloc
{
[_name release];
[super dealloc];
}
@end
//
// Nurse.h
// KVCDemo
//
// Created by 5016 on 13-12-19.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
@class Child;
@interface Nurse : NSObject
@property(retain,nonatomic)NSString* name;
@property(assign,nonatomic)NSInteger age;
@property(assign,nonatomic)Child* child;
-(Nurse *)initWithName:(NSString*) name andAge:(NSInteger) age andChild:(Child*)child;
@end
//
// Nurse.m
// KVCDemo
//
// Created by 5016 on 13-12-19.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Nurse.h"
#import "Child.h"
@implementation Nurse
@synthesize child = _child,name = _name,age=_age;
-(Nurse *)initWithName:(NSString*) name andAge:(NSInteger) age andChild:(Child*)child
{
if (self = [super init]) {
[self setValue:name forKey:@"name"];
[self setValue:[NSNumber numberWithInteger:age] forKey:@"age"];
[self setValue:child forKey:@"child"];
//添加观察者
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(wakeUpNotification:) name:@"wakeUp" object:nil];
}
return self;
}
//执行通知方法
-(void)wakeUpNotification:(NSNotification *)notify
{
//NSNumber *num = notify.object;
NSDictionary *dic =notify.userInfo;
NSLog(@"哈哈,小孩睡醒,%@",dic);
}
-(void)dealloc
{
[self.child removeObserver:self forKeyPath:@"sleep"];//移除监听
[_child release];
[_name release];
[super dealloc];
}
@end
//
// main.m
// NotificationDemo
//
// Created by 5016 on 13-12-19.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Nurse.h"
#import "Child.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Child *child = [[Child alloc] initWithName:@"dragn" andAge:2 andSleep:99];
Nurse *nurse = [[Nurse alloc]initWithName:@"xx" andAge:20 andChild:child];
[[NSRunLoop currentRunLoop]run];
}
return 0;
}