首页 > 其他 > 详细

05-IOSCore - 单例模式、KVO

时间:2014-03-05 21:33:09      阅读:591      评论:0      收藏:0      [点我收藏+]

单例模式

是设计模式之一,使用频率高,让数据或对象在程序的各个地方都能访问,保持唯一

要素:

各个地方都能访问方法

+ 静态消息 只要导入类 就能访问

保持唯一

1.在静态消息内限制对象的创建

2.外部不要调用alloc

bubuko.com,布布扣
#import "MXSingleton.h"

static MXSingleton * _instance;

@implementation MXSingleton

+(MXSingleton *)sharedInstance{

    if (_instance == nil) {

        _instance = [[MXSingleton alloc] init];

    }

    return _instance;

}

@end
bubuko.com,布布扣

 

单例模式下的共享数据

1.原因

         因为 单例模式的对象只有一个

         所以 在程序中任何位置创建都应该返回这个对象

         因为 在程序中任何地方都可以访问

         所以 这个返回的对象相当于在程序运行时共享

         因为 这个返回的对象在程序中单例并且共享

         所以 这个对象里面的属性可以作为共享数据

                 1)     能够让你在不同的vc之间传输数据

                          目的:降低vc之间的耦合度

                 2)     还能够在任何对象之间传送数据

                 3)     缺点

                          1.      你不够控制哪些对象不能修改/查询值

                          2.      你都不知道谁修改了 哪修改 怎么改 是修改/查询

                                  修改的顺序很难确定

                 4)     注意:

                          1.      两个VC之间联系紧密 还使用以前的正向/反向传值

                                  联系中导致中间对象无缘无故增加传输属性时

                                  再改用单例模式传值

         6.      其它应用

                 1.      系统应用

                          [NSNotificationCenter defaultCenter];

                          [UIApplication sharedApplication];

                          [NSUserDefaults standardDefault];

                          +      sharedXxxxx

                          +      defaultXxxxx

                          +      standardXxxxx

 

                 2.      单例模式数据共享做为模型层的数据中心

                          TRAppModel

                          @property (nonatomic, strong) NSMutableArray * contacts;

                          TRDataCenter

TRAppModel.h

bubuko.com,布布扣
#import <Foundation/Foundation.h>

#import "TRContact.h"

//DataCenter

@interface TRAppModel : NSObject

@property (nonatomic, strong) NSMutableArray * contacts;

//- (void) addContact:(TRContact *)contact;

- (void)save;

- (void)read;

+ (TRAppModel *) sharedInstance;

 

@end
bubuko.com,布布扣

 

TRAppModel.m

bubuko.com,布布扣
#import "TRAppModel.h"

#import "TRContact.h"

static TRAppModel * _sharedInstance;

@implementation TRAppModel

- (id)init

{

    self = [super init];

    if (self) {

        self.contacts = [NSMutableArray array];

        TRContact * contact = [[TRContact alloc] init];

        contact.name = @"三丧";

        contact.phoneNumber = @"911";

        [self.contacts addObject:contact];

    }

    return self;

}

//- (void) addContact:(TRContact *)contact

//{

//    [self.contacts addObject:contact];

//    // 对文件进行追加写入

//}

 

// 对象 -> 文件

- (void)save

{

    NSLog(@"%@",NSHomeDirectory());

    // 使用字符串|    plist    归档 都可以

    // 我使用归档

    NSMutableData *data = [NSMutableData data];

    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

    [archiver encodeObject:self.contacts forKey:@"contact"];

    [archiver finishEncoding];

    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

    NSString *dataPath = [documentsPath stringByAppendingPathComponent:@"data"];

   

    [[NSFileManager defaultManager] createFileAtPath:dataPath contents:data attributes:nil];

}

// 文件 -> 对象

- (void)read

{

    // 反归档

    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

    NSString *dataPath = [documentsPath stringByAppendingPathComponent:@"data"];

    NSData *data = [NSData dataWithContentsOfFile:dataPath];

    NSKeyedUnarchiver *unarchive = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

    NSArray *array = [unarchive decodeObjectForKey:@"contact"];

   

    self.contacts = [array mutableCopy];

   

}

 

+ (TRAppModel *) sharedInstance

{

    if(_sharedInstance == nil){

        _sharedInstance = [[TRAppModel alloc] init];

    }

    return _sharedInstance;

}

@end
bubuko.com,布布扣

 

二、 单例模式抽出模型层

         1.      效果

                 1)     可以将数据统一放到模型层对象中

                          减少C层之间的交互

                 2)     可以针对模型层增加存储/读取的消息

                          专门负责保存/恢复

 

                 3)     可以将业务逻辑也抽到模型层中

 

三、 KVO

         1.      什么是KVO

                 Key Value Observer        键值观察          

         2.      干什么的?

                 KVO

                          观察一个对象的属性的更改

         3.      观察者设计模式

                 1)     什么是?

                          关注一个对象,当对象变动时,得到通知

MXViewController.m

bubuko.com,布布扣
#import "MXViewController.h"

#import "MXPerson.h"

 

@interface MXViewController ()

@property(nonatomic,strong) MXPerson *person;

- (IBAction)textFieldName:(UITextField *)sender;

 

- (IBAction)levelChanged:(UIStepper *)sender;

@property (weak, nonatomic) IBOutlet UILabel *labelName;

@property (weak, nonatomic) IBOutlet UILabel *labelLevel;

@property (weak, nonatomic) IBOutlet UIProgressView *progressViewLabel;

 

@end

 

@implementation MXViewController

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    self.person = [[MXPerson alloc] init];

   

   

}

-(void)viewWillAppear:(BOOL)animated{

   

    // KVO 观察者模式  是对象观察对象里的属性是否有变化

    // 开始观察 如果有多个属性 就需要写多个addObserver进行观察

    [self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL]; // forKey表示要观察的对象,new是表示一旦有新值变化了 就会调用下面的方法

    [self.person addObserver:self forKeyPath:@"level" options:NSKeyValueObservingOptionNew context:NULL];

}

// 一旦被观察的对象有变化 就会调用此方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

    if ([keyPath isEqualToString:@"name"]) {

        self.labelName.text = self.person.name;

    }else if ([keyPath isEqualToString:@"level"]){

        self.labelLevel.text = self.person.level;

        self.progressViewLabel.progress = [self.person.level floatValue]/6;

    }

   

}

// 撤销观察

-(void)viewWillDisappear:(BOOL)animated{

    [super viewDidAppear:animated];

    [self.person removeObserver:self forKeyPath:@"name"];

    [self.person removeObserver:self forKeyPath:@"level"];

}

 

- (IBAction)textFieldName:(UITextField *)sender {

    self.person.name = sender.text;

}

 

- (IBAction)levelChanged:(UIStepper *)sender {

    self.person.level = [NSString stringWithFormat:@"%f",sender.value];

}

@end
View Code

05-IOSCore - 单例模式、KVO,布布扣,bubuko.com

05-IOSCore - 单例模式、KVO

原文:http://www.cnblogs.com/yangmx/p/3583112.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!