关闭

IOS中延时执行的几种方式的比较和汇总

923人阅读 评论(0) 收藏 举报

本文列举了四种延时执行某函数的方法及其一些区别。假如延时1秒时间执行下面的方法。

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

1.performSelector方法

[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];

此方式要求必须在主线程中执行,否则无效。
是一种非阻塞的执行方式,
暂时未找到取消执行的方法。

2.定时器:NSTimer

[NSTimer scheduledTimerWithTimeIn<wbr>terval:1.0f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];</wbr>

此方式要求必须在主线程中执行,否则无效。
是一种非阻塞的执行方式,
可以通过NSTimer类的- (void)invalidate;取消执行。

3. sleep方式

[NSThread sleepForTimeInterval:1.0f]; [self delayMethod];

此方式在主线程和子线程中均可执行。
是一种阻塞的执行方式,
建方放到子线程中,以免卡住界面
没有找到取消执行的方法。

4.GCD方式

double delayInSeconds = 1.0; <wbr></wbr>
 <wbr>__block ViewController* bself = self; <wbr></wbr></wbr>
 <wbr>dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));</wbr>
<span style="margin: 0px; padding: 0px; word-wrap: normal; word-break: normal;">dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ <wbr></wbr></span>
 <wbr>[bself delayMethod]; });</wbr>

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

浅谈iOS开发中方法延迟执行的几种方式

字数668 阅读4565 评论0 

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] delayMethodStart2015-08-31 10:56:59.363 CJDelayMethod[1080:39604] nextMethod2015-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] delayMethodStart2015-08-31 10:58:10.183 CJDelayMethod[1129:41106] nextMethod2015-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] delayMethodStart2015-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] delayMethodStart2015-08-31 10:59:21.653 CJDelayMethod[1181:42438] nextMethod2015-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]











1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

SPSS常见数据分析方法比较汇总

SPSS作为一款成熟的数据分析工具,其主要特点就是将各种各样的统计分析方法流程化模块化。 一、SPSS常用多变量分析技术比较汇总表 注: 卡方分析:定量两个定性变量的关联程度 简单相关...
  • aurorayqz
  • aurorayqz
  • 2017-04-09 00:54
  • 5647

iOS的三种多线程技术 对比分析

1.iOS的三种多线程技术                     1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发...
  • fhbystudy
  • fhbystudy
  • 2014-04-10 17:07
  • 10523

iOS 8种加锁 效率比较

iOS开发中常用的锁有如下几种 来比较一下遇到加锁的情况: 1. @synchronized 关键字加锁  2. NSLock 对象锁  3. NSCondition   4. NSConditio...
  • s3590024
  • s3590024
  • 2016-04-21 10:42
  • 1694

IOS中的几种比较常见的延时方法的介绍及各自优缺点

- (void)delayMethod { NSLog(@"execute"); } 1.performSelector方法 [self performSelector:@selector(delay...
  • BaiHuaXiu123
  • BaiHuaXiu123
  • 2016-03-03 11:49
  • 603

stm32CubeMX HAL库中延时的几种方式解析

stm32CubeMX HAL库中延时的几种方式解析 HAL_Dalay()是毫秒级延时,为了使用微秒级延时最近学习了一下,总结如下,推荐使用最后一种方式。 /* * 本文件包括...
  • hxkrrzq
  • hxkrrzq
  • 2016-10-13 17:11
  • 9267

Android 实现延时执行操作的几种方法 总结以及代码

Android 实现延时执行操作的几种方法 总结以及代码
  • stvel
  • stvel
  • 2016-10-13 18:37
  • 2312

(重复执行、延时)定时器实现的多种方式

作用: 1、定时执行某种功能 2、重复执行、定时重复执行、定次数执行某种功能 类别: 1、 Thread(new Runnable) 2、Thread() 3、Timer 4、Handler ····...
  • Mr_Leixiansheng
  • Mr_Leixiansheng
  • 2017-03-29 14:38
  • 296

IOS学习 GCD 延时执行三种方法 并行/串行/主队列综合练习 队列组 shift+command+o快速查找

-(void)touchesBegan:(NSSetUITouch *> *)touches withEvent:(UIEvent *)event{        [self demo]; } ...
  • ridxmc
  • ridxmc
  • 2016-03-31 23:35
  • 2635

iOS 延时执行的方法

iOS延时执行的四种方法#import "ViewController.h"@interface ViewController ()@end@implementation ViewController...
  • Ashimar_a
  • Ashimar_a
  • 2016-04-29 14:07
  • 430

IOS数据持久化的几种方式

  • 2017-02-08 15:32
  • 123KB
  • 下载
    个人资料
    • 访问:206082次
    • 积分:4648
    • 等级:
    • 排名:第7273名
    • 原创:271篇
    • 转载:0篇
    • 译文:0篇
    • 评论:20条
    最新评论