我怎样才能延缓方法调用1秒?

问题描述 投票:162回答:11

有没有一种简单的方法延迟的方法调用1秒?

我有一个触摸事件反应的UIImageView。当检测到触摸,一些动画发生在应用程序。两秒钟后,我想调用另一个方法。在这种情况下,我不能使用animationDidStop选择。

ios objective-c iphone cocoa-touch uikit
11个回答
255
投票
performSelector:withObject:afterDelay:

Document Reference


0
投票

在使用雨燕3

perform(<Selector>, with: <object>, afterDelay: <Time in Seconds>)

-35
投票

注意:这将暂停你的整个主题,而不仅仅是一种方法。 拨打电话睡觉/等待1000毫秒/停止只是想问你的方法之前?

Sleep(1000); // does nothing the next 1000 mSek

Methodcall(params); // now do the real thing

编辑:上述答案适用于一般的问题:“我怎样才能延缓方法调用1秒?”,这是在回答(INFACT7分钟原题的范围内给出答案的时候问这个问题: - ))。暂无相关信息给出关于当时的语言,所以恳请停止婆妈使用睡眠我的Xcode OG缺乏阶级的正确方法...


192
投票

你也可以使用块

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [object method]; 
});

大多数的时候,你会想用dispatch_get_main_queue,但如果在你可以使用一个global queue的方法,没有UI。

编辑:

斯威夫特3版本:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    object.method()
}

同样,DispatchQueue.global().asyncAfter(...也可能是一个不错的选择。


126
投票

做最好的办法是:

[self performSelector:@selector(YourFunctionName) 
           withObject:(can be Self or Object from other Classes) 
           afterDelay:(Time Of Delay)];

您也可以通过零作为withObject参数。

例如:

[self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ];

24
投票

现在已经有很多答案,他们是正确的。如果你想使用你应该寻找它包括在右下角的dispatch_after(在这里您可以选择Code Snippet Library元素)内的片段中的UI

所以,你只需要在代码编写调度调用这个片段:


17
投票

可以使用执行选择器,用于之后的0.1秒的延迟的方法是调用该下面的代码来做到这一点。

[self performSelector:@selector(InsertView)  withObject:nil afterDelay:0.1]; 

9
投票

你也可以:

[UIView animateWithDuration:1.0
                 animations:^{ self.view.alpha = 1.1; /* Some fake chages */ }
                 completion:^(BOOL finished)
{
    NSLog(@"A second lapsed.");
}];

你要假的一些改变,一些人认为这种情况下获得动画作品。这是哈克确实是,但我喜欢的基于块的东西。或包裹@mcfedr回答以下。


waitFor(1.0, ^
{
    NSLog(@"A second lapsed");
});

typedef void (^WaitCompletionBlock)();
void waitFor(NSTimeInterval duration, WaitCompletionBlock completion)
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC),
                   dispatch_get_main_queue(), ^
    { completion(); });
}

7
投票

你可以这样做

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

4
投票

斯威夫特2.X

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
 dispatch_after(delayTime, dispatch_get_main_queue()) {
 print("do some work")
}

斯威夫特3.X - & - 斯威夫特4

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
    print("do some work")
}

或传递escaping closure

func delay(seconds: Double, completion: @escaping()-> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: completion)
}

1
投票

有从检查溶液中的斯威夫特3的解决方案:

self.perform(#selector(self.targetMethod), with: self, afterDelay: 1.0)

并且有方法

@objc fileprivate func targetMethod(){

}
© www.soinside.com 2019 - 2024. All rights reserved.