iOS 延时调用

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.
}

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

时间: 2024-10-12 23:34:31

iOS 延时调用的相关文章

GCD 和延时调用

GCD 和延时调用 由 王巍 (@ONEVCAT) 发布于 2015/05/13 因为 Playground 不进行特别配置的话是无法在线程中进行调度的,因此本节中的示例代码需要在 Xcode 项目环境中运行.在 Playground 中可能无法得到正确的结果. GCD 是一种非常方便的使用多线程的方式.通过使用 GCD,我们可以在确保尽量简单的语法的前提下进行灵活的多线程编程.在 “复杂必死” 的多线程编程中,保持简单就是避免错误的金科玉律.好消息是在 Swift 中是可以无缝使用 GCD 的

ios闪光灯调用

引入 #import <AVFoundation/AVFoundation.h> 打开闪光灯 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (![device hasTorch]) {//判断是否有闪光灯 NSLog(@"no torch"); }else{ [device lockForConfiguration:nil];//锁定闪光

iOS:延时执行的三种方式

延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObject (NSDelayedPerforming) ※延时调用在当前线程使用特定模式的方法(如果数组没有数据或者参数为nil,则不会调用selector中方法) - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterD

支持APP手机应用(android和ios)接口调用 ,传输验证可用 shiro 的 MD5、SHA 等加密

请认准本正版代码,售后技术有保障,代码有持续更新.(盗版可耻,违者必究)         此为本公司团队开发 ------------------------------------------------------------------------------------------------------------------------- 1. 有 oracle .msyql.spring3.0.spring4.0  一共 4 套版本全部提供没有打jar没有加密的源代码(最下面截图2

iOS中调用短信、电话、邮件、Safari浏览器API

//调用短信 - (void)callMsg:(id)sender { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://135587"]]; } //调用电话 - (void)callTel:(id)sender { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://135587"

(转)iOS蓝牙调用的一般流程

文章转自:http://www.cnblogs.com/ctaodream/archive/2013/07/03/3169962.html 一.服务端(也叫周边设备吧..脑残的翻译) 1.实现类必须遵守协议 CBPeripheralManagerDelegate 2.需要的主要类有: @property(strong,nonatomic) CBPeripheralManager *peripheraManager; @property(strong,nonatomic) CBMutableCha

【转】performSelector延时调用导致的内存泄露

performSelector延时调用导致的内存泄露 转载:http://blog.csdn.net/wangqiuyun/article/details/7587929 前几天在给游戏做收尾测试时,发现了一个关于内存泄露的问题,一直没找着问题所在,经过反复调试和查找资料今天终于解决了,特此记录下来以免以后再犯! 关于objective-c的内存管理,我们都知道一个原则就是"谁创建,谁释放",换句话说,不是我们创建的,就不用我们去释放.但是实际上objective-c的内存管理远远没那

一个延时调用问题

如果用下面第1行的写法,调用 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(removeFromSuperview) object:nil]; 可以生效 如果用下面第3行的写法,调用 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(removeFromSuperview) object:nil];

ios中调用WCF

例子比较简单 记录下思路 1.接口中定义 实体和方法声明 //登录信息        [OperationContract]        [WebInvoke(UriTemplate = "LogInf/{name}/{pwd}", Method = "POST", ResponseFormat = WebMessageFormat.Json)]         LogInf GetLogInf(string name, string pwd); 2  //数据交