jyl*_*lee 43 objective-c wait ios performselector swift
我想UILabel在2秒后改变我的文字.
我尝试将我UILabel的文本设置为"文本",然后使用sleep(2)并最终将文本更改为"另一个文本".
但sleep(2)只冻结应用程序并设置"另一个文本"而不显示"A文本" 2秒.
如何显示"A text" 2秒然后显示"Another text"?
Yi *_*ang 80
我知道我迟到了.但我发现人们没有提到线程睡眠.如果您使用GCD调用该功能.您可以使用 :
[NSThread sleepForTimeInterval:2.0f];
Run Code Online (Sandbox Code Playgroud)
延迟线程2秒.
[self changeText: @"A text"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Here your non-main thread.
[NSThread sleepForTimeInterval:2.0f];
dispatch_async(dispatch_get_main_queue(), ^{
//Here you returns to main thread.
[self changeText: @"Another text"];
});
});
Run Code Online (Sandbox Code Playgroud)
我认为NSTimer是一个很好的解决方案.我的解决方案只是提供另一种选择来实现NSTimer的目标.
请阅读:我如何使用NSTimer?
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(doSomethingWhenTimeIsUp:)
userInfo:nil
repeats:NO];
Run Code Online (Sandbox Code Playgroud)
在课堂上,你需要这个方法:
- (void) doSomethingWhenTimeIsUp:(NSTimer*)t {
// YES! Do something here!!
}
Run Code Online (Sandbox Code Playgroud)
在Swift 2.0中,您可以使用以下方式:
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: "doSomethingWhenTimeIsUp:",
userInfo: nil,
repeats: false)
Run Code Online (Sandbox Code Playgroud)
它创建一个NSTimer的实体,并自动将计时器添加到与创建计时器的NSThread相关联的NSRunLoop.
在Swift 2.2中,调用select的方法是:
#selector(doSomethingWhenTimeIsUp(_:))
Run Code Online (Sandbox Code Playgroud)
所以,它是这样的:
NSTimer.scheduledTimerWithTimeInterval(2.0,
target: self,
selector: #selector(doSomethingWhenTimeIsUp()),
userInfo: nil,
repeats: false)
Run Code Online (Sandbox Code Playgroud)
在Swift 3中,调用select的方法是:
#selector(doSomethingWhenTimeIsUp)
Run Code Online (Sandbox Code Playgroud)
所以,它是这样的:
Timer.scheduledTimer(timeInterval: 2.0,
target: self,
selector:#selector(doSomethingWhenTimeIsUp),
userInfo: nil,
repeats: false)
Run Code Online (Sandbox Code Playgroud)
然后,func应该如下所示:
@objc private func doSomethingWhenTimeIsUp(){
// Do something when time is up
}
Run Code Online (Sandbox Code Playgroud)
在Swift 4中,我们可以按照以下方式进行操作.
let delaySeconds = 2.0
DispatchQueue.main.asyncAfter(deadline: .now() + delaySeconds) {
doSomethingWhenTimeIsUp()
}
Run Code Online (Sandbox Code Playgroud)
然后,func应该如下所示:
private func doSomethingWhenTimeIsUp(){
// Do something when time is up
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*gar 40
您可以使用
[self performSelector:@selector(changeText:) withObject:text afterDelay:2.0];
Run Code Online (Sandbox Code Playgroud)
或者如果要定期显示,请检查NSTimer课程.
Mic*_*lum 28
Grand Central Dispatch有一个辅助功能,dispatch_after()用于在延迟之后执行操作,这可能非常有用.您可以指定执行前等待的时间量以及dispatch_queue_t要运行的实例.您可以使用dispatch_get_main_queue()在主(UI)线程上执行.
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// do something
});
Run Code Online (Sandbox Code Playgroud)
在Swift 3中,上面的例子可以写成:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
Sri*_*aju 12
你可以NSTimer像这样使用-
[NSTimer scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(updateLabel:)
userInfo:nil
repeats:YES];
Run Code Online (Sandbox Code Playgroud)
定义另一种方法updateLabel并在那里进行更新.定义您的timeInterval以满足您的需求......
同时进行设置repeats以YES确保每0.5秒执行一次此选择器(在上述情况下).
您可以使用计时器完成此操作,例如
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:4.0 target:self selector:@selector(eventToFire:) userInfo:nil repeats:YES]; // Fire every 4 seconds.
...
- (void)eventToFire:(NSTimer*)timer {
// Do Something
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
77692 次 |
| 最近记录: |