[ios]ios的延迟执行方法

1.最直接的方法performSelector:withObject:afterDelay:

这种方法的缺点:每次要为延时写一个方法

2.使用类别,用BOLCK执行

[代码]c#/cpp/oc代码:

01 @implementation NSObject (PerformBlockAfterDelay)
02  
03 - (void)performBlock:(void (^)(void))block
04           afterDelay:(NSTimeInterval)delay
05 {
06     block = [[block copy] autorelease];
07     [self performSelector:@selector(fireBlockAfterDelay:)
08                withObject:block
09                afterDelay:delay];
10 }
11  
12 - (void)fireBlockAfterDelay:(void (^)(void))block {
13     block();
14 }
15  
16 @end

3.使用GCD

[代码]c#/cpp/oc代码:

1 void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void))
2 {
3     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*delay),
4       dispatch_get_current_queue(), block);
5 }

poolo:注意 图中的dispatch_getcurrent_queue() 方法在ios6已经被kill了

现在用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0)

第一个参数是优先级有,第二个参数为0或nil

如果要要对界面操作则使用dispatch_get_main_queue();

参考:http://www.cnblogs.com/guwandong/archive/2012/08/08/2626211.html

4.可能是不太好的方法,用animation的completion参数

[代码]c#/cpp/oc代码:

1 [UIView animateWithDuration:0.0 delay:5.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
2 } completion:^(BOOL finished) {
3     //do stuff here
4 }];

5.使用NSOperationQueue,在应用程序的下一个主循环执行:

[代码]c#/cpp/oc代码:

1 [[NSOperationQueue mainQueue] addOperationWithBlock:aBlock];

这个和调用performSelector: with afterDelay of 0.0f等价

[ios]ios的延迟执行方法

时间: 2024-08-15 01:17:42

[ios]ios的延迟执行方法的相关文章

iOS 设置 延迟执行 与 取消延迟执行 方法 以及对 run loop 初步认识

之前开发过程中经常会有需求会使用 NSObject中的"performSelector:withObject:afterDelay:"做方法延迟执行的处理, 但是 还没有什么地方需要实现 取消 这个延迟执行方法"cancelPreviousPerformRequestsWithTarget:".(具体可参见系统库文件 NSOject里面两个方法的声明). 但是 我们应该知道在什么条件下,合理使用 延迟 与 取消延迟. 延迟 和 取消延迟 应该 在同一个 事件处理循环

IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget

本文非本人撰写 [cpp] view plaincopy @interface NSObject (NSDelayedPerforming) - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes; - (void)performSelector:(SEL)aSelector withObject:(id)a

iOS让程序延迟执行

//会卡住主线程 [NSThread sleepForTimeInterval:时间(秒)]; //定制延迟任务后,不会卡主线程,在主线程执行 [self performSelector:@selector(方法名) withObject:方法参数 afterDelay:时间(秒)]; //GCD延迟执行 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(时间(秒) * NSEC_PER_SEC)), dispatch_get_m

IOS中延迟执行的几种方法

前几天去国美在线面试,就遇到了上面的问题,当时是笔试,只写出来了第一种方法,现在整理了一下. //1.performSelector方法:在当前线程中执行的方法,使用默认模式,并延迟执行@selector方法. [self performSelector:@selector(runDelayMethod) withObject:nil afterDelay:2.0]; //取消之前注册的performSelector:withObject:afterDelay:这个方法 //[NSObject

iOS开发延迟执行一个方法的方法

在实际的开发中,有时候需要延迟一段时间执行某个方法或者某段代码,总结两种延迟执行某段代码的方式: 1. [self performSelector: withObject: afterDelay:]; 延迟执行(SEL)里面的方法,是oc中的一个方法.第一个参数是要执行的方法,第二个参数是执行的方法的参数,可以有一个参数也可以为nil.第三个参数是多长时间后执行该方法,该方法是单线程的. 2. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (in

iOS: 零误差或极小误差的定时执行或延迟执行?

问题如下: 节奏类游戏需要执行很多的跟音乐节拍相关的操作,并且为了保证节奏感,需要让操作跟节拍的关系十分紧密.对两者间隔要求不能超过0.02秒或更低. 目前使用了 GCD 中的 asyncAfter(deadline:)方法,不过误差总是要大于0.05秒,并且还无法保证误差会不会传递下去.请问有更好的方式来解决误差吗? var time = Date().timeIntervalSince1970 let dq = DispatchQueue(label: "queue", qos:

iOS 代码延迟执行

1. [NSTread sleepForTimeInterval:0.8f] 这个方法 实际效果 好比打断点 等你再恢复断点执行 2.  [self performSelector:@selector(fun:) withObject:nil afterDelay:0.8f]; 这个 就适合UI层级的 异步方式  延迟执行  比较好  还有延迟执行的方法 "fun" 按需求来 当前笔记待补充

iOS的过程方法与执行方法

过程方法与执行方法,官方没有这一说法,属个人总结. 按苹果 cocoa 命名规则,will表将要执行一个动作,内容是准备数据:should表一个动作方法执行前的许可,返回类型多为bool,did表确认行为,执行操作并给出结果. 从这里,可以理解为will为发起方法should类为过程方法,即走个过场,拿个验证(bool),因此,一些大的动作就不能在这类方法中执行.  Should就像钥匙, 当用钥匙开门,如果门好开,验证完,推下钥匙也能打开,类比在should中作些小动作也未尝不可,但如果动作过

iOS 延迟执行代码

//延迟执行 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{ //要执行的代码 });