在项目中我时常会遇到一些弹窗类提示,产品说让它突然显示太突兀了,我夸❌一个嘴巴子,“你咋那么多事”。不过我心善就勉强接受他的建议加了点动画,在此就用到下面的一些延时操作。
现阶段我共知道四种能完成上述要求的方法:
1.NSObject方法
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];
主线程中执行;
非阻塞的执行方式;
可以通过cancelPreviousPerformRequestsWithTarget取消执行。
2.定时器:NSTimer
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
主线程执行;
非阻塞的执行方式;
可以通过NSTimer类的- (void)invalidate;取消执行。
3.NSThread
[NSThread sleepForTimeInterval:1.0];
[self delayMethod];
主线程和子线程均可执行;
一种阻塞的执行方式,因此建议放在子线程中执行;
暂时未有取消执行的方法。
4.GCD
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
// 小提示此为延迟提交 不是延迟执行
dispatch_after(popTime, dispatch_get_main_queue(), ^{
[self delayMethod];
});
通过参数选择在主线程或子线程中执行;
非阻塞的执行方法;
暂时未有取消执行的方法
DEMO
建议将该效果进行封装,程序员要多心疼自己,少写点是点0-0.
#pragma mark --移除活动规则View
- (void)removeRulesClick {
UIButton *button = [self.view viewWithTag:2222];
[UIView animateWithDuration:0.5 animations:^{
button.alpha = 0;
rulesView.alpha = 0;
}];
[self performSelector:@selector(removeRulesView) withObject:nil afterDelay:0.5f];
}
- (void)removeRulesView {
UIButton * button = [self.view viewWithTag:2222];
[button removeFromSuperview];
[rulesView removeFromSuperview];
}
总结完上面,突然感觉自己子线程这块记忆有点模糊了,下一篇应该会写一点子线程方面的东西吧0_0。