iOS Block Part8:block^延迟(番外)

我们有的时候会借助Block做延迟操作.如:GCD的dispatch_after,[UIView animate...] delay,AFN的网路请求.当然前两个是人为可控制的,第三个是看网络的心情.

1.GCD dispatch_after

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self doSomeThingsAct];
    });
}

GCD实现延迟是保证Block存在,到时间再调用.
所以以上代码在延迟期间Block是持有VC的.如果延迟期间想要VC的销毁,也是不能实现的.

2.AFN的网路请求

- (void)viewDidLoad {
    [super viewDidLoad];
    AFHTTPSessionManager * mgr = [AFHTTPSessionManager manager];
    [mgr GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSData * responseData) {
        [self doSomeThingsAct];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [self doSomeThingsAct2];
    }];
}

网络请求实现延迟回调的方式是也保证Block一直存在,直到网络返回数据,再调用Block.
所以以上代码在延迟期间Block是持有VC的.如果延迟期间想要VC的销毁,也是不能实现的.

3.[UIView animate...] delay

- (void)viewDidLoad {
    [super viewDidLoad];
    [UIView animateWithDuration:2.5 delay:20.0 options:0 animations:^{
        [self doSomeThingsAct];
    } completion:^(BOOL finished) {
        [self doSomeThingsAct2];
    }];
}

1.API性质决定对[动画Block],先执行,延迟刷新UI;(所以[动画Block]不用考虑延迟)
2.延迟时间内,VC退出,[完成block]也会立刻调用+销毁,VC销毁也正常.(API内部有优化)

结论:[UIView animate...]系列方法Block内放心用self,GCD的dispatch_after和AFN的网路请求的用Block还是要注意.
其他系统API,第三方库也用到Block,是否有延迟,是否会因为延迟带来问题,我们得用到时候自己看看.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,217评论 30 472
  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 1,441评论 1 27
  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,484评论 2 4
  • 终于,趁着天气暖和,趁着想家的念头,趁着不再忙忙碌碌,回到了久违的家。尽管已经不是原来的模样,尽管恍如昨日这般,尽...
    显山露水阅读 348评论 2 1
  • 傍晚小街路面上沁出微雨后的湿润,和煦的西风吹来,抬头看看天边的晚霞。嗯,明天又是一个好天气,走到水果摊旁,挑了个敲...
    ColdRomantic阅读 565评论 0 0