iOS多个线程发起相同请求,避免重复

简介: 有时候在调用多个模块时,会对同一个API进行多次请求,但因为内容都是一样的,所以最好就是加上锁,防止重复请求造成网络资源浪费

前言

有时候在调用多个模块时,会对同一个API进行多次请求,但因为内容都是一样的,所以最好就是加上锁,防止重复请求造成网络资源浪费

处理方法

@synchronized (self) {//加锁,避免数组重复创建添加等问题
         static NSMutableArray * successBlocks;//用数组保存回调
         static NSMutableArray * failureBlocks;
         static dispatch_once_t onceToken;
         dispatch_once(&onceToken, ^{//仅创建一次数组
            successBlocks = [NSMutableArray new];
            failureBlocks = [NSMutableArray new];
         });
         if (success) {//每调用一次此函数,就把回调加进数组中
            [successBlocks addObject:success];
         }
         if (failure) {
            [failureBlocks addObject:failure];
         }
         static BOOL isProcessing = NO;
         if (isProcessing == YES) {//如果已经在请求了,就不再发出新的请求
            return;
         }
         isProcessing = YES;
         [self callerPostTransactionId:transactionId parameters:dic showActivityIndicator:showActivityIndicator showErrorAlterView:showErrorAlterView success:^(id responseObject) {
            @synchronized (self) {//网络请求的回调也要加锁,这里是另一个线程了
               for (successBlock eachSuccess in successBlocks) { //遍历回调数组,把结果发给每个调用者
                  eachSuccess(responseObject);
               }
               [successBlocks removeAllObjects];
               [failureBlocks removeAllObjects];
               isProcessing = NO;
            }
         } failure:^(id data) {
            @synchronized (self) {
               for (failureBlock eachFailure in failureBlocks) {
                  eachFailure(data);
               }
               [successBlocks removeAllObjects];
               [failureBlocks removeAllObjects];
               isProcessing = NO;
            }
         }];
      }


目录
相关文章
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
39 0
|
3月前
|
iOS开发
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
38 1
|
7月前
|
iOS开发
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
221 0
|
3月前
|
存储 Linux API
select、poll、epoll、多线程实现并发请求处理
select、poll、epoll、多线程实现并发请求处理
28 0
|
4月前
|
存储 移动开发 JavaScript
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
|
7月前
|
iOS开发
iOS开发 GET、POST请求方法:NSURLSession篇
iOS开发 GET、POST请求方法:NSURLSession篇
74 0
|
7月前
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
489 1
|
9月前
|
缓存 负载均衡 前端开发
【计算机组成原理】4核心8线程的服务器每秒大概能处理多少请求?
【计算机组成原理】4核心8线程的服务器每秒大概能处理多少请求?
190 0
|
9月前
|
数据采集 负载均衡 Python
如何利用Python的请求库和代理实现多线程网页抓取的并发控制
如何利用Python的请求库和代理实现多线程网页抓取的并发控制
|
9月前
|
NoSQL Redis 数据安全/隐私保护
Redis单线程处理IO请求性能瓶颈有哪些?
Redis单线程处理IO请求性能瓶颈有哪些?

热门文章

最新文章