zoukankan      html  css  js  c++  java
  • 第一篇献给你:Block的回调

    回调:在一处声明和定义,有调用权限。在另一处实现,无调用权限。

    关于将block做为方法的参数进行传递:

    给出了block的实现内容

    1.发送消息queryContactOlineStatusResult

    2.此时指针进入方法queryContactOlineStatusResult:内部,此时不需理会做为参数出现的block的实现部分,完全无视它就好,可以将他们看做参数A  ,仅此而已。(只是恰好在此处实现而已,与此时的上下文语境没有半点关系)然后执行方法queryContactOlineStatusResult(A)的方法体。

       
        [[ContactManager defaultManager] queryContactOlineStatusResult:^(NSMutableArray *resultArray, NSMutableDictionary *resultDictionary) { //实现
            _onlineStatusDic.dictionary = [NSDictionary dictionaryWithDictionary:resultDictionary];
            if (weakSelf.dataArray.count) {
                [weakSelf reloadTable];
            } else {
                [weakSelf autoTriggerHeaderRefresh];
            }

        }// 在此处的block仅为实现部分,整体的实现作为一个参数,并不会在此处执行block。

    ];

    好了,回调出现于此,方法体中终于出现了你:

    “result(_onlineStatusArray, _onlineStatusDictionary);”需要执行的block!!

    此时回调(可认为是系统实现的回调动作)之前的block实现!进行运算

     //此时给出了参数A的实际名称为result。

    - (void)queryContactOlineStatusResult:(void (^)(NSMutableArray *, NSMutableDictionary *))result  //定义
    {
        if (_onlineStatusArray && _onlineStatusDictionary) {
            if (result) {
                result(_onlineStatusArray, _onlineStatusDictionary);                 //回调上述block的实现部分,在此处执行,对_onlineStatusDic.dictionary进行赋值。然后[weakSelf reloadTable]加载table,,或重新请求[weakSelf autoTriggerHeaderRefresh]。然后回调完成。
            }
        } else {
            NSMutableArray *resultArray = [NSMutableArray array];
            NSMutableDictionary *resultDictionary = [NSMutableDictionary dictionary];
            NSString *originFilePath = [[NSBundle mainBundle] pathForResource:@"OnlineStatus" ofType:@"plist"];
            NSArray *originArray = [[NSArray alloc] initWithContentsOfFile:originFilePath];
            for (NSDictionary *itemDic in originArray) {
                LXOnlineState *tempModel = [[LXOnlineState alloc] init];
                tempModel.name    = [itemDic valueForKey:@"name"];
                tempModel.icon    = [itemDic valueForKey:@"icon"];
                tempModel.stateID = [itemDic valueForKey:@"state"];
                [resultArray addObject:tempModel];
                [resultDictionary setValue:tempModel forKey:tempModel.stateID];
            }
            _onlineStatusArray = [NSMutableArray arrayWithArray:resultArray];
            _onlineStatusDictionary = [NSMutableDictionary dictionaryWithDictionary:resultDictionary];
            if (result) {
                result(_onlineStatusArray, _onlineStatusDictionary);
            }
        }
    }

    转一篇:http://www.cnblogs.com/ygm900/p/3633131.html (简单、粗暴、易懂)

                   对Block回调机制进行改写,让她还原成函数调用最本质的样子

    1.声明并创建block

      void(^callBack)(NSMutableArray *, NSMutableDictionary *);

      callBack = ^(NSMutableArray * resultArray, NSMutableDictionary * resultDictionary)

            {

              _onlineStatusDic.dictionary = [NSDictionary dictionaryWithDictionary:resultDictionary];
                    if (weakSelf.dataArray.count) {
                             [weakSelf reloadTable];
                    } else {
                             [weakSelf autoTriggerHeaderRefresh];
                        }

                  

           };

    2.发送消息

          [ [ContactManager defaultManager] queryContactOlineStatusResult:callBack];

    3.方法实现:

    - (void)queryContactOlineStatusResult:callBack //形参

    {
        if (_onlineStatusArray && _onlineStatusDictionary) {
            if (callBack) {
                callBack(_onlineStatusArray, _onlineStatusDictionary);
            }
        } else {
            NSMutableArray *resultArray = [NSMutableArray array];
            NSMutableDictionary *resultDictionary = [NSMutableDictionary dictionary];
            NSString *originFilePath = [[NSBundle mainBundle] pathForResource:@"OnlineStatus" ofType:@"plist"];
            NSArray *originArray = [[NSArray alloc] initWithContentsOfFile:originFilePath];
            for (NSDictionary *itemDic in originArray) {
                LXOnlineState *tempModel = [[LXOnlineState alloc] init];
                tempModel.name    = [itemDic valueForKey:@"name"];
                tempModel.icon    = [itemDic valueForKey:@"icon"];
                tempModel.stateID = [itemDic valueForKey:@"state"];
                [resultArray addObject:tempModel];
                [resultDictionary setValue:tempModel forKey:tempModel.stateID];
            }
            _onlineStatusArray = [NSMutableArray arrayWithArray:resultArray];
            _onlineStatusDictionary = [NSMutableDictionary dictionaryWithDictionary:resultDictionary];
            if (callBack) {
                callBack(_onlineStatusArray, _onlineStatusDictionary);
            }
        }
    }

     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    关于JavaScipt对象的基本知识
    《最终幻想6》敌人全部魔法一览
    敬爱的GitHub” —— 致GitHub的一封地下信   英文原文:"Dear GitHub…" An Open Letter to GitHub
    分享十个JavaScript在线调试工具
    分享十二个有用的jQuery代码
    进度条
    标准Lookup中使用Group By 过滤数据
    常用的X++
    输出Warning后,判断是断续
    ax没有distinct ,只能projId进行group by
  • 原文地址:https://www.cnblogs.com/liuziyu/p/4169835.html
Copyright © 2011-2022 走看看