美文网首页
iOS延时请求

iOS延时请求

作者: ashura_ | 来源:发表于2017-05-03 20:17 被阅读0次

需求

在某些时候,需要对请求进行延时处理。
例如:

  • 对某条评论进行点赞,如果用户无限点击赞/取消赞按钮,就会无限发出请求。这是一种不合理的做法。通常采用一种折中的办法,在点击按钮一段时候(例如1秒)后才真正发出请求。
ScreenShot_20161110150104.png

例如:在切换不同Tab时候要调用不同的API

ScreenShot_20161110150508.png

解决方案

  • 在UI层面,添加一个分类
/**
 *  @brief 在 delay秒之后,执行action操作
 *
 *  @param action    执行的操作
 *  @param newObject 参数
 *  @param delay     延时时间
 */
-(void)debounceAction:(SEL)action object:(id)newObject delay:(NSTimeInterval)delay;

实现

+(void)debounceForTarget:(id)target action:(SEL)action object:(id)newObject delay:(NSTimeInterval)delay{
    
    if(target == nil || action == nil){ return;}
    
    // NSString *selectorString = NSStringFromSelector(action);
    // id oldObj = objc_getAssociatedObject(target,[selectorString UTF8String]); // WRONG
    id oldObj = objc_getAssociatedObject(target,action);
    //NSLog(@"oldObj:%@",oldObj);
    [NSObject cancelPreviousPerformRequestsWithTarget:target selector:action object:oldObj];
    
    // Why do we need to retain this object???
    objc_setAssociatedObject(target, action, newObject, OBJC_ASSOCIATION_RETAIN);
    
    // NSString *selectorString2 = NSStringFromSelector(action);
    // id newObj = objc_getAssociatedObject(target,[selectorString2 UTF8String]);
    
    //id newObj = objc_getAssociatedObject(target,@selector(action));
    //NSLog(@"newObj:%@",newObj);
    [target performSelector:action withObject:newObject afterDelay:delay];
    
}

-(void)debounceAction:(SEL)action object:(id)newObject delay:(NSTimeInterval)delay{
    [[self class] debounceForTarget:self action:action object:newObject delay:delay];
}


+(void)debounceForTarget:(id)target action:(SEL)action objectToBeCancelled:(id)oldObject objectToBePerform:(id)newObject delay:(NSTimeInterval)delay{
    
    NSAssert(target != nil, @"target 不能为nil", nil);
    
    // !!! call this method may cancel other actions ,
    //[NSObject cancelPreviousPerformRequestsWithTarget:target];
    
    [NSObject cancelPreviousPerformRequestsWithTarget:target selector:action object:oldObject];
    
    //    [NSObject cancelPreviousPerformRequestsWithTarget:target selector:action object:object];
    //  the Argument [object] may be different with last performrequest,if so,the last perform will not be cancelled. 
    [target performSelector:action withObject:newObject afterDelay:delay];
    
}

Demo

别人的gitNSObject-DebounceDemo.

  • 在http request里增加time之类的想法,改动便捷性都不合适。

相关文章

  • iOS延时请求

    需求 在某些时候,需要对请求进行延时处理。例如:对某条评论进行点赞,如果用户无限点击赞/取消赞按钮,就会无限发出请...

  • IOS3

    1、 2、iOS中常用的延时方法iOS常见的延时执行有2种方式调用NSObject的方法[self perform...

  • IOS延时

    1. performSelector(NSObject)方法 ** 取消 ** 2. NSTimer方法 2....

  • iOS 延时

    1 NSTimer //1秒后执行 NSTimer *timer = [NSTimer timerWithTim...

  • iOS 延时执行的实现

    iOS中延时执行的4种方法

  • 优化UITextField 输入每个字符延时请求,用于联想搜索

    UITextField 代理方法-----实时监控输入内容 延时请求方法

  • android 线程管理类

    1. 延时任务以及取消延时的应用场景:实时搜索,文字内容变化时候不发送请求,当停止变化指定时间后再发送请求 2. ...

  • 构建高并发低延时系统

    构建高并发低延时系统 并发指系统的吞吐率,在单位时间内可以处理多少请求;延时是从单个请求的角度来看,需要多长时间才...

  • iOS网络请求相关框架的使用

    iOS网络请求相关框架的使用 iOS网络请求相关框架的使用

  • 技术贴:3.iOS中的延时执行

    延迟执行也叫做延时执行。在iOS中有三种延时执行方式: 1.调用NSObject的方法 [self perform...

网友评论

      本文标题:iOS延时请求

      本文链接:https://www.haomeiwen.com/subject/ebeltxtx.html