博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一篇献给你:Block的回调
阅读量:5154 次
发布时间:2019-06-13

本文共 3839 字,大约阅读时间需要 12 分钟。

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

 

关于将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);
        }
    }
}

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/liuziyu/p/4169835.html

你可能感兴趣的文章
微博项目学习笔记
查看>>
proxifier 代理bluestack
查看>>
(VC/MFC)多线程(Multi-Threading) -1. 基本概念.
查看>>
快数据时代下,Moka携手DataPipeline提升招聘效能
查看>>
day1 用户登陆三次机会
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
LeetCode Ones and Zeroes
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
第九周作业
查看>>
MiniMagick
查看>>
css important
查看>>
KindEditor图片上传到七牛云
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
[转] C语言的谜题
查看>>
Java中的日期和时间
查看>>
禁用windows2000.2003启动时的CTRL+ALT+DEL
查看>>
Django基于admin的stark组件创建(一)
查看>>
快速幂 模板及应用
查看>>