2018-10-27 12:42:19 u013983033 阅读数 174

项目开发中经常会用到方法的延时调用,下面列举现有的几种实现方式:

  • 1、performSelector

    2、NSTimer

    3、sleep

    4、GCD

下面对上面的几种进行详细的介绍:

第一个方法 : performSelector
代码:

NSLog(@"延迟之前");
[self performSelector:@selector(performSelectorMa) withObject:self afterDelay:2];
NSLog(@"延迟之后");

- (void)performSelectorMa {
    NSLog(@"延迟了"); 
}

运行结果 :
在这里插入图片描述
同理 对于的全部取消的performSelector延迟方法

 [NSObject cancelPreviousPerformRequestsWithTarget:self];

取消某个方法的延迟

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(perform) object:nil];

第二个方法:NSTimer

延迟方法

timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timerAfter) userInfo:nil repeats:NO];

取消延迟

 [timer invalidate];//关闭定时器

执行结果 :
在这里插入图片描述

第三个方法:sleep
sleep是NSThread 线程里面的方法:但是这个方法会阻塞线程;使用的时候要视情况而定;
代码实现

 [NSThread sleepForTimeInterval:2];

执行效果 :
在这里插入图片描述

第四个方法:GCD

代码实现 :

/**
     DISPATCH_TIME_NOW 延迟从当前时间开始
 */
__weak typeof (self) weakSelf = self;
int64_t time = 3;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [weakSelf gcdAfter];//防止循环引用
});

运行结果:
在这里插入图片描述
以上就是几种延迟方法的使用;

csdn demo

github demo

2016-03-01 11:19:51 hexingle_ios 阅读数 1939
  1. 说到iOS页面间的跳转,最常用的莫过于push/present这两种;习惯用xib/storyboard的或许还知道segues跳转(无需代码);还有就是UITabBarController和UINavigationController了。

  2. present跳转延迟的问题:点击cell,跳转另一个ViewController
    当点击cell跳转的时候,发现有明显的延迟。或者你再次点击一下才会立即跳转。

  3. 解决方法:由于某种原因,presentViewController里的内容并不会真的马上触发执行,除非有一个主线程事件触发。比如在弹出慢的时候,你随便点击一下屏幕,马上就能弹出来
    只为唤醒主线程
    将跳转放在主线程执行
2016-05-11 21:35:45 hero_wqb 阅读数 591

列举iOS开发中,几种延迟执行的方法:

1. GCD方法:(可设置在主线程还是子线程执行)

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//do something...
});
2. performSelector方法:(必须在主线程)

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

3. sleep方法:(主线程、子线程均可,阻塞式执行方式)

[NSThread sleepForTimeInterval:1.0f];
//do something...

4. 定时器,NSTimer方法:(必须在主线程)

[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(method) userInfo:nil repeats:NO];



2019-09-04 19:40:15 helloschurmi 阅读数 166

追溯至 2007 年初。苹果公司在发布首款 iPhone 前夕,遇到一个问题:当时的网站都是为大屏幕设备所设计的。于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点的问题。这当中最出名的,当属双击缩放(double tap to zoom),这也是会有上述 300 毫秒延迟的主要原因。双击缩放,顾名思义,即用手指在屏幕上快速点击两次,iOS 自带的 Safari 浏览器会将网页缩放至原始比例。

 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击。为了能够立即响应用户的点击事件,才有了FastClick。

而FastClick在以下情况下不需要使用的:

1.FastClick是不会对PC浏览器添加监听事件

2.Android版Chrome 32+浏览器,如果设置viewport meta的值为width=device-width,这种情况下浏览器会马上出发点击事件,不       会延迟300毫秒。

3.所有版本的Android Chrome浏览器,如果设置viewport meta的值有user-scalable=no,浏览器也是会马上出发点击事件。

4.IE11+浏览器设置了css的属性touch-action: manipulation,它会在某些标签(a,button等)禁止双击事件,IE10的为-ms-touch-      action: manipulation

所以在ios系统下是需要的。(IOS11 已经修复了300秒延迟。)

但是在使用之后,input 获取焦点会出现问题,需要双击才会唤醒键盘。

这时候可以修改源码来实现,

本人相对简单的解决办法,修改以下位置的代码

var _isTextInput = function(){
  return targetTagName === 'textarea' || (targetTagName === 'input' && targetElement.type === 'text');
};
 
if ((!deviceIsIOS || targetTagName !== 'select') && !_isTextInput()) {
  this.targetElement = null;
  event.preventDefault();
}

 

 

2016-06-04 16:01:10 jacob_ios 阅读数 1674

需求:在需要执行一个操作后,延迟3秒再次执行该操作的方法,

  • 方法一:
    缺点:连续重复的操作也会被记录执行,会出现停止点击后,该方法连续执行好几次的现象,用户体验差
 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self updatePlayBarStatus];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self updatePlayBarStatus];
    });
  • 方法二:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self updatePlayBarStatus];    
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [self performSelector:@selector(updatePlayBarStatus) withObject:nil afterDelay:3];
}
1.performSelector: withObject: afterDelay: 这个方法是单线程的,也就是说只有当前调用此方法的函数执行完毕后,selector方法才会被调用。
2.cancelPreviousPerformRequestsWithTarget 不到后续参数表示取消全部。
没有更多推荐了,返回首页