延迟后执行方法不使用 NSThread 或 sleep() - 还有其他选择吗?

Posted

技术标签:

【中文标题】延迟后执行方法不使用 NSThread 或 sleep() - 还有其他选择吗?【英文标题】:execute method after delay not using NSThread or sleep() - is there another option? 【发布时间】:2011-07-12 14:06:10 【问题描述】:

ios4 中是否有办法在延迟后使用 NSThread 以外的其他方法调用方法或使用 sleep() 阻塞 UI?

【问题讨论】:

【参考方案1】:
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
        // code to be executed on main thread.If you want to run in another thread, create other queue
    );

【讨论】:

这正是我要找的东西,我几周前偶然发现了它,但又找不到它!!! 在 Xcode 中键入 dispatch_a 并按 ESC,自动完成将使用此代码启动:D 美人。感谢您提供这个简单(且有效)的示例)。赞成!【参考方案2】:
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

NSObject 会为你做这件事。

此外,您可以创建一个NSTimer 并让它在给定时间后对某个目标和选择器执行回调。

【讨论】:

【参考方案3】:

您可以使用NSTimer。 (例如timerWithTimeInterval:target:selector:userInfo:repeats

【讨论】:

如果您重视必须取消方法的调用,我会说这是最好的,因为您可以保留 NSTimer 并按需失效。【参考方案4】:
[self performSelector:@selector(methodName) withObject:nil afterDelay:2.0];

【讨论】:

【参考方案5】:
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self 
         selector:@selector(aMethod:) userInfo:nil repeats:NO];

- (void) aMethod:(NSTimer *) aTimer 
  //task to do after the delay.

【讨论】:

定时器方法应该有一个参数;计时器在触发时自行进入:- (void) aMethod: (NSTimer *)tim; 没有它也能正常工作。但是 API 文档建议发送 timer 参数。谢谢。【参考方案6】:

您可以通过以下方式轻松做到这一点:

[self performSelector:@selector(methodName) withObject:nil afterDelay:5];

【讨论】:

以上是关于延迟后执行方法不使用 NSThread 或 sleep() - 还有其他选择吗?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 延时执行问题求指教:

用于 CoreMotion 和准确计时目的的 NSThread、NSOperation 或 GCD?

NSThread

线程的sleep()方法和yield()方法区别

使用 JavaScript 在特定延迟后执行脚本

线程的sleep()方法和yield()方法有什么区别?