iOS 高效开发-----延时执行用GCD

早期我们使用延时执行的方法都是用NSObject 类提供的,performSelector:系列的方法,具体有哪些我们看一下

我们一般让某个对象延时执行某个方法都会调用包含  afterDelay这个参数的方法,此参数即代表延时多长时间执行 ,但是这一系列的方法的参数都只接受继承自NSObject类得对象,也就是说如果我们要向其中传入基本的数据类型,那就必须涉及到数据类型转换,这显然会增加开销,而且这一系列的方法最多也就能传如一个参数,如果我们要传多个参数怎么办呢 ,如果想继续使用这个方法,那我们就必须把多个参数写入数组或字典中去,然后把数组或字典对象传给这个方法,那么着就又会增加我们插入数组或字典,解析数组或字典的代码 ,数据量达到一定情况的话,这个开销是可想而知的,而且我们还要知道数组和字典中得每个对象都代表什么,很麻烦;

不过我们可以用块来解决这一问题 ,GCD 为我们提供了一个演示执行的块函数,其具体定义如下:

void dispatch_after ( dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block );

我们在调用此方法的时候,系统也考虑的很周到,当我们写入dispatch_after时,这个完整的函数就会呈现出来,我们看一下

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

    });

调用很方便,如果我们想把里面的内容放到主线程中去运行的话,也很方便,例如:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    dispatch_async(dispatch_get_main_queue(), ^{
        [son study];
    });
});

还记得当时有一个问题,就是想给UIButton的点击事件加点料,让系统中的所有的按钮都禁止快速点击或者连击,当时问了看了好多博客,都没有好的解决方案,前篇一律的讨论或者建议,都是使用performSelector:afterDelay这种方法,但是这样的话,我还要实现另一个方法 。后来是这么解决的呢 ,这里再次引用我之前写的内容,重写父类函数,然后使用GCD的dispatch_after 方法解决;

具体实现如下:

//
//  CommonButton.h
//  CommonButton
//
//  Created by pk on 14/12/24.
//  Copyright (c) 2014年 pk. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface CommonButton : UIButton

@end

  

//
//  CommonButton.m
//  CommonButton
//
//  Created by pk on 14/12/24.
//  Copyright (c) 2014年 pk. All rights reserved.
//

#import "CommonButton.h"

@implementation CommonButton

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
    [super sendAction:action to:target forEvent:event];
    self.enabled = NO;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.enabled = YES;
    });
}

@end

  

这样的实现,很清楚,结构简明,使用简单,想使用此方法,只要将改一下类得继承就行;

总结:performSelector 系列方法所能处理的选择器太过于局限性了 ,选择器的返回值类型和参数的个数都会受到限制;

    而dispatch_after就没有这些问题,另外,如果想把任务放在另一个线程上执行,最好不要用performSelector系列方法,而应该把任务封装到块里,然后调用GCD的相关方法来实现就行

时间: 2024-07-29 14:25:35

iOS 高效开发-----延时执行用GCD的相关文章

iOS 高效开发-----实现description 方法 (续)

在 “iOS 高效开发-----实现description 方法”这篇文章的最后,我留下了一个问题,就是,如果要给每个自定义的类覆写description方法和debugDescription方法 ,那将是一件非常庞大的工作量 ,因为自定义的类很多 ,而且每个自定义的类中的属性都会随着需求的修改出现变化 ,那么就又得修改这两个方法,那就变得无穷无尽了,永无宁日了,要么不用,要么就要找到更好得方法去用. 接下来,我们会用到动态运行时runtime. 我们先假设我们要处理的类中的属性都是OC的对象,

iOS常见的延时执行有2种方式

调用NSObject的方法 [self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // 2秒后再调用self的run方法 使用GCD函数 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 2秒后异步执行这里的代码... });

iOS 高效开发-----实现description 方法

无论开发什么程序,也不管编写程序的程序猿的水平多高 ,肯定都会用到调试,肯定会经常打印查看对象的信息: 常用的方式就是使用NSLog,例如: NSLog(@"obj = %@",obj) 运行后,obj对象会收到description消息,该方法所返回的描述信息将取代“格式化字符串”里的“%@”,如果obj是一个数组的话,请看下面的例子: //数组 NSArray* obj = @[@1,@2,@3]; NSLog(@"obj = %@",obj); //打印信息如

ios 高效开发-----字面量

Objective-C(一下简称OC) 的语法比较繁杂,但是从OC 1.0 版本起,有一种非常简便的方式能创建NSString 对象,那就是字面量,也就是本篇文章的核心内容.其语法如下: 字面字符串 NSString * string = @"i'm a string"; 如果不用这种方法的话,就要用常见得alloc及init 方法 字面数值 OC提供的用于处理数值(整数.浮点数.bool值)的类是NSNumber,该类提供的主要类方法如下 如果不是用字面量,创建方式如下: NSNum

iOS开发多线程篇 08 —GCD的常见用法

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)), dispat

[iOS 多线程 &amp; 网络 - 1.2] - 多线程GCD

A.GCD基本使用 1.GCD的概念 什么是GCD全称是Grand Central Dispatch,可译为"牛逼的中枢调度器"纯C语言,提供了非常多强大的函数 GCD的优势GCD是苹果公司为多核的并行运算提出的解决方案GCD会自动利用更多的CPU内核(比如双核.四核)GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程)程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 2.任务和队列 GCD中有2个核心概念任务:执行什么操作队列:用来存放任务 GCD的使用就

【iOS开发系列】延时执行的几种方式

/* 本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. */ - (void)delayMethod { NSLog(@"execute"); } /** * [1].performSelector方法 */ [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f]; // 此方式要求必须在主线程中执行,否则无效. // 是一种非阻塞的执行方式, // 暂时未

iOS开发之延时执行

方法1: performSelector(SEL) withObjects:(id) afterDelay:(NSTimeInterval); 方法2: dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //需要延时执行的代码 });

iOS开发-多线程之GCD(Grand Central Dispatch)

Grand Central Dispatch(GCD)是一个强有力的方式取执行多线程任务,不管你在回调的时候是异步或者同步的,可以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.开发使用的过程中只需要将执行的任务并添加到到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务.Dispatch Queue更简单而且在实现符合需求的多线程任务时更有效率.Dispatch  Queue一般来说有三种方式,如下图: Serial执行的时候的先进先出,Concurrent