浅谈iOS 对于block的一点理解

 更新时间:2017年09月07日 10:28:13   作者:worldzhy  
本篇文章主要介绍了iOS 对于block的一点理解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline的,并且它对局部变量是只读的。

Block的定义:

   int (^myBlock) (int a,int b) = ^(int a,int b){ 
    return a+b; 
  }; 

 定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义?

Block可以访问局部变量,但是不能修改。比如下面的代码就会报编译错

int num = 0; 
  //使用block  
  int (^myBlock) (int a,int b) = ^(int a,int b){ 
    num = a+b; 
    return num; 
  }; 

如果要修改就要加关键字:__block (注意,是两个下划线"_")

__block int num = 0; 
  //使用block  
  int (^myBlock) (int a,int b) = ^(int a,int b){ 
    num = a+b; 
    return num; 
  }; 

作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时block里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。

以上是转来的一些block基本知识,下面说一下自己的学习体会。

初次接触objective-c, 看到block时一下子被它的语法格式吓到了,感觉很别扭。起初只是把block当作代码段,并没有看到它的威力。由于项目中涉及一些网络请求操作,需要异步处理,要求使用block,这才真正去了解它。下面说一下block是怎样做异步处理的。

假设A有一个任务,是去仓库取一张A4纸放到会议室,然后在纸上写一份策划书。取纸又要经过仓库管理员,于是A通知仓库管理员来张纸过来。由于管理员是个老头动作很慢,另外A还有其他工作,如果一直等待管理员就太浪费时间了,合理的做法是让仓库管理员进行取纸这项工作,A在通知管理员后就继续自己的工作。A不知道仓库管理员什么时候能完成取纸,也就不知道什么时候可以在纸上写策划书。这时block机制就派上用场了,使用这种机制,可以让A在通知仓库管理员取纸的同时,告诉仓库管理员将纸放到编号XX会议室,并安排好将要在纸上写的策划内容,当管理员把纸拿来后,可能过一会就会有个助理将策划内容写到纸上。

我们将这个故事对应到代码上:

#pragma mark - 第三方登录 
 
- (void)btnLoginWeiboClicked:(id)sender { 
   
  [_waitCircle startAnimating]; 
   
  [[HSLoginClass createInstance] loginWithPlatformType:ShareTypeSinaWeibo withBlock:^(BOOL success, id message) { 
    if (success) { 
      //跳出登录页面 
      [self dismissViewControllerAnimated:YES completion:^{}]; 
      [_waitCircle stopAnimating]; 
      NSLog(@"新浪微博 %@", message); 
       
    } else { 
    } 
  }]; 
 
  //test statistics 
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     
    NSDate* date = [NSDate date]; 
    NSTimeInterval nowTime = [date timeIntervalSince1970]; 
    NSString* netStatus = (NSString*)[[NSUserDefaults standardUserDefaults] objectForKey:NETSTATUS]; 
    [[HSStatisticsModule statisticsModule] makeSession:nowTime :OPER_IN :@"noid"]; 
    [[HSStatisticsModule statisticsModule] upLoadData:netStatus :[NSString stringWithFormat:@"%f", nowTime]]; 
     
  }); 
 
} 

请看这段代码,整个方法是A要做的工作,startAnimating/loginWithPlatformType/dispatch_async分别是A要做的三个任务,由于loginWithPlatformType需要一段时间才能完成,并且loginWithPlatformType完成后要根据结果做相应处理,所以我们对loginWithPlatformType进行异步处理。block代码段是loginWithPlatformType得到结果后要做的操作H,这里的block写法就表示,我们先将操作H安排好,然后继续其他工作,当loginWithPlatformType执行ok后自会有人(可能是那个助理)去执行操作H。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • iOS 微信分享功能简单实现

    iOS 微信分享功能简单实现

    本文介绍了iOS 微信分享功能的实现步骤与方法,具有一定的参考作用。下面跟着小编一起来看下吧
    2017-01-01
  • 浅谈iOS关于头文件的导入问题

    浅谈iOS关于头文件的导入问题

    本篇文章主要介绍了浅谈iOS关于头文件的导入问题,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • iOS禁用右滑返回的两种方法

    iOS禁用右滑返回的两种方法

    这篇文章主要为大家详细介绍了iOS禁用右滑返回的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • iOS App初次启动时的用户引导页制作实例分享

    iOS App初次启动时的用户引导页制作实例分享

    这篇文章主要介绍了iOS App初次启动时的用户引导页制作实例分享,其中判断程序是否是第一次或版本更新以后第一次启动是一个关键点,需要的朋友可以参考下
    2016-03-03
  • ios下OC与JS交互之WKWebView

    ios下OC与JS交互之WKWebView

    本篇文章主要介绍了ios下OC与JS交互之WKWebView,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 通过源码分析iOS中的深拷贝与浅拷贝

    通过源码分析iOS中的深拷贝与浅拷贝

    这篇文章主要给大家介绍了如何通过源码分析iOS中的深拷贝与浅拷贝的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • iOS判断用户是否打开APP通知开关

    iOS判断用户是否打开APP通知开关

    这篇文章主要为大家详细介绍了iOS判断用户是否打开APP通知开关的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Swift Self详解及简单实例代码

    Swift Self详解及简单实例代码

    这篇文章主要介绍了Swift Self详解及简单实例代码的相关资料,这里对self 进行了详细介绍并附实例代码,需要的朋友可以参考下
    2016-12-12
  • iOS 正则表达式详解

    iOS 正则表达式详解

    在ios中系统自带的正则表达式用法大家都很清楚吧,除了正则可以用还有NSScanner这个类,下面小编给大家简单介绍下
    2016-08-08
  • iOS去除Webview键盘顶部工具栏的方法

    iOS去除Webview键盘顶部工具栏的方法

    这篇文章主要给大家介绍了关于iOS去除Webview键盘顶部工具栏的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06

最新评论