zoukankan      html  css  js  c++  java
  • iOS 常用的两种延迟执行方法 和 一次性代码 合并照片 组队列 以上是 GCD 常用方法

    一、延迟执行
    1.介绍
    iOS常见的延时执行有2种方式

    (1)调用NSObject的方法

    [self performSelector:@selector(run) withObject:nil afterDelay:2.0];

    // 2秒后再调用self的run方法

    (2)使用GCD函数

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        // 2秒后异步执行这里的代码...

    });

    第一种方法,该方法在那个线程调用,那么run就在哪个线程执行(当前线程),通常是主线程。

    [self performSelector:@selector(run) withObject:nil afterDelay:3.0];

    说明:在3秒钟之后,执行run函数

    二、一次性代码

    1.实现一次性代码

    需求:点击控制器只有第一次点击的时候才打印。

    实现代码:

    复制代码
     1 //
     2 //  YYViewController.m
     3 //  03-GCD常见使用(一次性代码)
     4 //
     5 //  Created by apple on 14-6-25.
     6 //  Copyright (c) 2014年 itcase. All rights reserved.
     7 //
     8 
     9 #import "YYViewController.h"
    10 
    11 @interface YYViewController ()
    12 @property(nonatomic,assign) BOOL log;
    13 @end
    14 
    15 @implementation YYViewController
    16 
    17 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    18 {
    19     if (_log==NO) {
    20         NSLog(@"该行代码只执行一次");
    21         _log=YES;
    22     }
    23 }
    24 @end
    复制代码

    缺点:这是一个对象方法,如果又创建一个新的控制器,那么打印代码又会执行,因为每个新创建的控制器都有自己的布尔类型,且新创建的默认为NO,因此不能保证改行代码在整个程序中只打印一次。

    2.使用dispatch_once一次性代码

    使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        // 只执行1次的代码(这里面默认是线程安全的)

    });

    整个程序运行过程中,只会执行一次。

    代码示例:

    复制代码
     1 //
     2 //  YYViewController.m
     3 //  03-GCD常见使用(一次性代码)
     4 //
     5 //  Created by apple on 14-6-25.
     6 //  Copyright (c) 2014年 itcase. All rights reserved.
     7 //
     8 
     9 #import "YYViewController.h"
    10 
    11 @interface YYViewController ()
    12 @property(nonatomic,assign) BOOL log;
    13 @end
    14 
    15 @implementation YYViewController
    16 
    17 //-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    18 //{
    19 //    if (_log==NO) {
    20 //        NSLog(@"该行代码只执行一次");
    21 //        _log=YES;
    22 //    }
    23 //}
    24 
    25 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    26 {
    27     static dispatch_once_t onceToken;
    28     dispatch_once(&onceToken, ^{
    29         NSLog(@"该行代码只执行一次");
    30     });
    31 }
    32 @end
    复制代码

    效果(程序运行过程中,打印代码只会执行一次):

    两张照片合并成一张照片
    self.imageView1.image=image1; 50 self.imageView2.image=image2; 51 //合并两张图片 52 UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0); 53 [image1 drawInRect:CGRectMake(0, 0, 100, 100)]; 54 [image2 drawInRect:CGRectMake(100, 0, 100, 100)]; 55 self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();

    2.补充说明

    有这么1种需求:

    首先:分别异步执行2个耗时的操作

    其次:等2个异步操作都执行完毕后,再回到主线程执行操作

     

    如果想要快速高效地实现上述需求,可以考虑用队列组

    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), ^{

        // 执行1个耗时的异步操作

    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        // 等前面的异步操作都执行完毕后,回到主线程...

    });



  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/yecong/p/6515137.html
Copyright © 2011-2022 走看看