zoukankan      html  css  js  c++  java
  • 使用委托在对象间传递信息

        程序运行时,程序中的各个实例必定会交互,互相影响状态。这个在我们起初设计的时候,就会考虑进去。于是就必须使用一种比较妥当的方式,在对象之间传递消息。这些消息可能是一些变量、常量,也可能是一个事件,比如下载完成。我这几天在coding的时候,发现自己原先一直用的定义public变量的方法实在太土太无语。于是仔细研究了一下objective-c中对象之间传递信息的方法。发现委托机制非常不错。

        委托机制,字面理解就是找个委托人来做一些事情。比如我有一个下载类(定义为WizDownload),他的主要功能是负责与服务器交互,下载数据。但是下载完成后数据怎么处理就不是这个类负责了(这符合单一职责原则),是由另外一个类负责(WizDownloadViewController)。那怎样在这两个类之间传递下载完成的消息呢。我曾经用到的有这么几种方案:
        一。定义public变量。在WizDownload中定义一个(id)Owner和SEL,在事件发生后,调用owner的SEL。
     1 @interface WizDownload :NSObject
     2 {
     3     id owner;
     4     SEL selector;
     5 }
     6 ...........
     7 
     8 - (void) downloadDone
     9 {
    10     [owner selector];
    11 }

    但是这种反感充满了腐臭味,完全破坏了类结构,如果有一个类要继承WizDownload,完全没有必要继承这两个变量。从另一方面讲这样做代码量也十分大。

      二、使用NSNotification机制。在WizDownloadViewController中注册监听下载完成消息。然后在WizDownload下载完成后发送一个下载完成的消息。

    #define WizDownloadDoneMessage   @"WizDownloadDoneMessage"
    //WizDownloadViewController
    - (void) downloadDone
    {
        .......
    }
    - (id) init
    { 
        ...
       [ [NSNotificationCenter defaultCenter] addobserver:self selector:@selector(downloadDone).......];
        ...
    }
    
    //WizDownload
    
    - (void) downloadDone
    {
        [[NSNotificationCenter defaultCenter] postMessage......];
    }

    这样代码完全没有结构。只是依靠一个消息机制来控制程序的行为,而且,如果另外一个对象意外的也这册了这个消息。就会引发不必要的行为。所以这种方案也并不是很好。

      三、下面说到的就是主角——委托机制了。

       委托机制是Objective-C中一种常用的模式。主要使用的技术是协议。使用下面的代码来说明更合适一点。这样的结构清晰明了。

     1 @protocol WizDownloadDelegate
     2 - (void) downloadDone;
     3 @end
     4 
     5 @interface WizDownload : NSObject
     6 {
     7    id <WizDownloadDelegate> delegate;
     8 }
     9 @property (retain) id <WizDownloadDelegate> delegate;
    10 @end
    11 
    12 @implement WizDownload
    13 - (void) wizDownloadDone
    14 {
    15   .....
    16   [delegate downloadDone];
    17   .....
    18 }
    19 @end
    20 
    21 
    22 @interface WizDownloadController :NSObject <WizDownloadDelegate>
    23   ......
    24 @end
    25 
    26 @implement WIzDownloadController
    27 - (void) downloadDone
    28 {
    29   .....
    30 }
    31 @end

     http://www.wiz.cn

  • 相关阅读:
    GridView 配合模板实现 合并单元格(多列)
    Parse和Convert的区别
    'EntityValidationErrors' property for more details
    This 在 C# 中的含义
    C# 之 深入理解using
    尝试从数据库进行更新时,遇到..
    处理远程桌面不能复制粘贴解决办法
    Can't load AMD 64-bit .dll on a IA 32-bit platform错误
    MyBatis笔试题
    MyBatis延迟加载和缓存
  • 原文地址:https://www.cnblogs.com/yishuiliunian/p/2461536.html
Copyright © 2011-2022 走看看