Method1. performSelector方法

Method2. NSTimer定时器

Method3. NSThread线程的sleep

Method4. GCD


公用延迟执行方法

- (void)delayMethod{ NSLog(@"delayMethodEnd"); }


Method1:performSelector

[self performSelector:@selector(delayMethod) withObject:nil/*可传任意类型参数*/ afterDelay:2.0];
注:此方法是一种非阻塞的执行方式,未找到取消执行的方法。

程序运行结束
2015-08-31 10:56:59.361 CJDelayMethod[1080:39604] delayMethodStart
2015-08-31 10:56:59.363 CJDelayMethod[1080:39604] nextMethod
2015-08-31 10:57:01.364 CJDelayMethod[1080:39604] delayMethodEnd

Method2:NSTimer定时器

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
注:此方法是一种非阻塞的执行方式,
取消执行方法:- (void)invalidate;即可

程序运行结束
2015-08-31 10:58:10.182 CJDelayMethod[1129:41106] delayMethodStart
2015-08-31 10:58:10.183 CJDelayMethod[1129:41106] nextMethod
2015-08-31 10:58:12.185 CJDelayMethod[1129:41106] delayMethodEnd

Method3:NSThread线程的sleep

[NSThread sleepForTimeInterval:2.0];
注:此方法是一种阻塞执行方式,建议放在子线程中执行,否则会卡住界面。但有时还是需要阻塞执行,如进入欢迎界面需要沉睡3秒才进入主界面时。
没有找到取消执行方式。

程序运行结束
2015-08-31 10:58:41.501 CJDelayMethod[1153:41698] delayMethodStart
2015-08-31 10:58:43.507 CJDelayMethod[1153:41698] nextMethod

Method4:GCD

__block ViewController/*主控制器*/ *weakSelf = self;

dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0/*延迟执行时间*/ * NSEC_PER_SEC));

dispatch_after(delayTime, dispatch_get_main_queue(), ^{
[weakSelf delayMethod];
});`

注:此方法可以在参数中选择执行的线程,是一种非阻塞执行方式。没有找到取消执行方式。

程序运行结束
2015-08-31 10:59:21.652 CJDelayMethod[1181:42438] delayMethodStart
2015-08-31 10:59:21.653 CJDelayMethod[1181:42438] nextMethod
2015-08-31 10:59:23.653 CJDelayMethod[1181:42438] delayMethodEnd

完整代码参见:

//
// ViewController.m
// CJDelayMethod
//
// Created by 陈杰 on 8/31/15.
// Copyright (c) 2015 chenjie. All rights reserved.
//

import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong) NSTimer timer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"delayMethodStart");
[self methodOnePerformSelector];
// [self methodTwoNSTimer];
// [self methodThreeSleep];
// [self methodFourGCD];
NSLog(@"nextMethod");
}

- (void)methodFiveAnimation{
[UIView animateWithDuration:0 delay:2.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
} completion:^(BOOL finished) {
[self delayMethod];
}];
}

- (void)methodFourGCD{
__block ViewController
weakSelf = self;
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
[weakSelf delayMethod];
});
}

- (void)methodThreeSleep{
[NSThread sleepForTimeInterval:2.0];
}

- (void)methodTwoNSTimer{
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
}

- (void)methodOnePerformSelector{
[self performSelector:@selector(delayMethod) withObject:nil/*可传任意类型参数*/ afterDelay:2.0];
}

- (void)delayMethod{
NSLog(@"delayMethodEnd");
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end


欢迎关注笨笨编程官方微博账号

[http://weibo.com/2728581591/profile?topnav=1&wvr=6]

 
文/笨笨编程(简书作者)
原文链接:http://www.jianshu.com/p/6ed28a29b391
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

浅谈iOS开发中方法延迟执行的几种方式的更多相关文章

  1. iOS开发中方法延迟执行的几种方式

    概述 项目开发中经常会用到方法的延时调用,下面列举常用的几种实现方式: 1.performSelector 2.NSTimer 3.NSThread线程的sleep 4.GCD 1.performSe ...

  2. 浅谈iOS开发中多语言的字符串排序

    一.前言 在iOS开发中,一个经常的场景是利用tableview展示一组数据,以很多首歌曲为例子.为了便于查找,一般会把这些歌曲按照一定的顺序排列,还会加上索引条以便于快速定位. 由于歌曲名可能有数字 ...

  3. 怎样在Android开发中FPS游戏实现的两种方式比较

    怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...

  4. 浅谈iOS开发的协议(protocol)和代理(delegate)

    协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...

  5. 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系

    (1)设置状态栏的2种方式 --第一种方式就是我们在控制器中设置,系统默认就是交给视图控制器去管理的,这样不同视图控制器能够自己定义不同的状态栏例如以下: -(BOOL)prefersStatusBa ...

  6. iOS App中数据加载的6种方式

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  7. 浅谈Web开发中的定时任务

    曾经做过Windows server下的定时任务的业务,最近又做了一些Linux下使用Crontab做的定时任务的业务,觉得有必要进行一次小结,于是有了如下这篇文章. Windows Server下 ...

  8. iOS开发中获取文本的宽高的方式

    /** 计算单行文字的size @parms  文本 @parms  字体 @return  字体的CGSize */ + (CGSize)sizeWithText:(NSString *)text ...

  9. Web开发中 前端路由 实现的几种方式和适用场景

    http://blog.csdn.net/xllily_11/article/details/51820909

随机推荐

  1. git pull request

    如何发 PR 以下以 wiki-pages 为例 把项目 fork 到自己名下,然后 clone 到本地 git clone git@code.xiaojukeji.com:yexiliang/wik ...

  2. 16. 3Sum Closest

    题目: Given an array S of n integers, find three integers in S such that the sum is closest to a given ...

  3. Windows无法安装到GPT分区的磁盘的解决方法

    thinkpad 预装win8的机子,硬盘采用gpt分区,在重新安装其它系统的时候是无法安装的,会提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区 形式".所以先采用下面的方 ...

  4. springMVC 的工作原理和机制

    工作原理上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web. ...

  5. 终端下vim无法输入问题解决

    最近回归vim时发现会偶尔出现vim无法输入,但光标在动的情况,一度怀疑是spf13的问题,后来经搜索,才发现是因为vim下,快捷键 Ctrl+s 的功能是停止输入,在IDE下编程时间长了,都有潜意识 ...

  6. C++ 系列:C++ 基础 001

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  7. Jquery Mobile开发以及Js对象动态绑定

    动态创建对象并绑定属性: var instantiate = function (Type, args) { var Constructor = function () { }; Constructo ...

  8. Mysql的一些使用

    1.批量执行脚本 source sql路径

  9. Codeforces Round #254 (Div. 2) A DZY Loves Chessboard

    先生成nXm的BW棋盘 BWBWBWBW WBWBWBWB BWBWBWBW WBWBWBWB 类似上面交替变换 然后将输入为’-’的地方替换成‘-’即可 #include <iostream& ...

  10. compass Sprites 雪碧图 小图片合成[Sass和compass学习笔记]

    demo 源码 地址 https://github.com/qqqzhch/webfans 什么是雪碧图? CSS雪碧 即CSS Sprites,也有人叫它CSS精灵,是一种CSS图像合并技术,该方法 ...