回调:在一处声明和定义,有调用权限。在另一处实现,无调用权限。
关于将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); } }}