小胖说事20--------GCD笔记

1.系统提供的dispatch方法

为了方便的使用GCD,苹果提供了一些方法方便我们将BLOCK放在主线程或者后台程序执行,或者延后执行。

    //后台执行:
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //something
    });
    //主线程执行
    dispatch_async(dispatch_get_main_queue(), ^{
        //something
    });
    //一次执行完
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        //something
    });
    //延迟2秒执行
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
        //something
    });

dipatch_queue_t也可以自己定义,通过dispatch_queue_creat方法实现,例如:

    dispatch_queue_t my_queue = dispatch_queue_create("myQueue", NULL);
    dispatch_async(my_queue, ^{
        //something
    });
    dispatch_release(my_queue);

另外GCD还有一些高级用法,比如,让后台两个线程并行执行,然后等两个线程都结束后,在汇总执行结果:

    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //并行执行的线程1
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //并行执行的线程2
    });
    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //汇总结果
    });

2.后台运行

使用block可以让程序在后台较长久的运行,以前的时候应该被按HOME键之后,最多只有5秒钟的后台运行时间,但是应用可以调用UIApllication的beginBackgroundTaskWithExoirationHandler方法,让应用程序最多有10分钟的时间在后台运行,这个时候可以做清理缓存,发送统计数据等等。

//AppDelegate.h文件
@property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundUpdateTask;
//APPDelegate.m
- (void)applicationDidEnterBackground:(UIApplication *)application {

    [self beginBackgrooundUpdateTask];
    //在这里加上你需要长久运行的代码
    [self  endBackgrooundUpdateTask];
}

-(void)beginBackgrooundUpdateTask
{
    self.backBackgroundUpdateTask = [[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:^{
        [self  endBackgrooundUpdateTask];
    }];
}

-(void)endBackgrooundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask:self.backBackgroundUpdateTask];
    self.backBackgroundUpdateTask = UIBackgroundTaskInvalid;
}
时间: 2024-10-13 17:13:40

小胖说事20--------GCD笔记的相关文章

小胖说事35-----Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer posi

2011-06-11 15:19:17.167 ***[930:707] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]' *** Call stack at first throw: ( 0   CoreFoundation                      0x3365d64f __exce

小胖说事35-----Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer posi

2011-06-11 15:19:17.167 ***[930:707] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]' *** Call stack at first throw: ( 0   CoreFoundation                      0x3365d64f __exce

小胖说事24-----property's synthesized getter follows Cocoa naming convention for returning 'owned' objec

今天在给类的属性命名的时候,用了newValue,就给报错:property's synthesized getter follows Cocoa naming convention for returning 'owned' objects,一阵郁闷不知道咋回事,后来查了资料后,原来是命名规范的事情: You own any object you create You create an object using a method whose name begins with "alloc&q

2017.12.20 英语笔记

第四单元 Working in a team Listening C B D Dictation 1.fast-paced 2.ever-changing 3.evolve 4.emerge 5.enough 6.business 7.Initially 8.lightweight 9.people-centric 10.Alliance 11.statement 12.interactions 13.doucumenttation 14.customer 15.responding 16.pr

2016.02.20 学习笔记 数据在Activity之间的传递的情况

情况一:一个Activity跳转到另一个Activity时,将第一个Activity的数据传递到第二个Activity里面. 分析:当一个界面跳转到另一个界面的同时还要讲数据传递过去,这种情况需要用Intent类putExtra()方法实现. 具体在Onclick方法中的样例代码如下: Intent i1=new Intent(this,SecondActivity.class); String Message=Edit1.getText().toString(); i1.putExtra("M

2017/04/20学习笔记

man man 查看帮助文档echo $PATHreboot 重启poweroff 关机 vim --vimvim是从vi发展过来的一款文本编辑器vim的三种工作模式命令模式--打开vim之后,默认模式编辑模式--需要输液一些命令,切换到编辑模式末行模式--在末行模式下可以输入一些命令 :号 aiosAIOS w保存光标移动HJKL行首:0行尾:$文件开始:gg结束:G行跳转: 300G x:删除光标所在字符u: 撤销X:删除光标前字符dw:删除单词d0:删除光标前d$:删除光标后 Ddd:删除

小胖说事29-----iOS中Navigation中左滑pop页面的三种方法

1.系统自带pop方法">系统自带pop方法 如果我们没有对navigation中的back按钮进行自定义,我们可以直接使用系统自带的左滑pop方法.但是如果我们对back按钮,进行了自定义,我们就要对self.navigationController.interactivePopGestureRecognizer这个属性进行设置了.关键代码: __weak typeof(self) weakSelf = self; self.navigationController.interactiv

小胖说事30------iOS 强制转成横屏的方式

一直遇到这个问题,今天最终找到了解决方法. 在我们的项目中常常遇到横竖屏切换,而又有某个特定的界面必须是特定的显示方式(横屏或竖屏).这就须要例如以下的处理了. 强制转成横屏: if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) { SEL selector = NSSelectorFromString(@"setOrientation:"); NSInvocation *invoc

小胖说事28------iOS中extern,static和const差别和使用方法

通俗的讲: extern字段使用的时候,声明的变量为全局变量,都能够调用,也有这样一种比較狭义的说法:extern能够扩展一个类中的变量到还有一个类中: static声明的变量是静态变量,变量值改变过之后,保存这次改变,每次使用的时候都要读取一遍值. const声明过得变量值是不可改变的.是readonly的属性,不能够改变变量的值. 详细使用方法: 1.static的使用方法:static NSString *str = @"哈哈"; 2.const的使用方法:NSString *c