• 使用委托在对象间传递信息


        程序运行时,程序中的各个实例必定会交互,互相影响状态。这个在我们起初设计的时候,就会考虑进去。于是就必须使用一种比较妥当的方式,在对象之间传递消息。这些消息可能是一些变量、常量,也可能是一个事件,比如下载完成。我这几天在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

  • 相关阅读:
    运用jQuery实现动态点赞
    $scope作用及模块化解决全局问题
    angular数据绑定---js全局学习
    HDU 2102 A计划 (深搜)
    ffmpeg 常用命令汇总
    基于Red5与ffmpeg实现rtmp处理NVR或摄像头的监控视频处理方案
    Linux 下编写.sh文件运行JAR下的Class
    如何帮助团队完成一个优秀的API文档,Swagger和Spring Rest Docs两个都是十分优秀的工具!...
    你关心的学历问题在这里
    北京一二线大厂以及程序员层级分布
  • 原文地址:https://www.cnblogs.com/yishuiliunian/p/2461536.html
Copyright © 2020-2023  润新知