美文网首页
网络请求中,避免多个block错乱

网络请求中,避免多个block错乱

作者: conowen | 来源:发表于2017-02-15 16:11 被阅读78次
 * author:conowen@大钟                                                                                                                          
 * E-mail:conowen@hotmail.com      

1、block的定义

关于block的定义可以参考我之前的一篇文章

2、多个Block导致的问题

假设这么一个场景,需要进行多次的socket请求;发送网络请求A,然后继续发送网络请求B�,每个网络请求会带有Block作为返回的结果(这连个网络请求的Block类型都是一样的),但是可能由于各种网络原因,网络请求B可能先通过Block返回结果,而网络请求A最后才通过Block返回结果,这时候就导致Block错乱,不知道这个Block是哪个请求返回的。

3、解决思路

假设网络请求如下

- (void)sendCommand:(uint32_t)requestCode
               data:(nullable NSData *)data
               flag:(uint32_t)flag
        receiveData:(void(^ _Nullable)(__kindof NSData *__nonnull receiveCmdPackage))receiveCmdDataBlock
     receiveTimeOut:(NSTimeInterval) receiveTimeOut
receiveTimeOutBlock:(void(^ _Nullable)())receiveCmdTimeOutBlock;

发起网络请求时,附带一个随机数tag作为参数发送到服务器,然后新建一个保存Block的Object。

key = tag;
value = block;

如下代码:

    BlockObject *blockObject = [BlockObject new];
    blockObject.receiveCmdTimeOutBlock = receiveCmdTimeOutBlock;
    blockObject.receiveCmdDataBlock = receiveCmdDataBlock;
    blockObject.CMD = requestCode;
    [[BlockHelper sharedInstance] addRequestItem:blockObject];

服务器接收到刚刚作为参数传过来的tag,网络返回数据时同时带有作为参数的tag,这样就可以通过tag在刚刚的object队列里面取出block,然后回调block即可。

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
  BlockObject *request = [[BlockHelper sharedInstance] getRequestItemWithCMD:self.readCmdSocketCmdId seq:self.readCmdSocketSeq];
 if (request.receiveCmdDataBlock) {
    request.receiveCmdDataBlock(readData);
 }
  if ((self.readCmdSocketFlag & 0x02) == 0) {
     [[BlockHelper sharedInstance] removeRequestItem:request.tag];
}

相关文章

  • 网络请求中,避免多个block错乱

    1、block的定义 关于block的定义可以参考我之前的一篇文章 2、多个Block导致的问题 假设这么一个场景...

  • 网络请求中的block

    场景 block和delegate是iOS开发者经常用到的技术,也常常出现在各种面试题里,你经常听到他们之间的对比...

  • block基础及在网络请求和block嵌套中的使用

    在网络请求的开发中,一般会将请求结果封装成一个 block 回调。block 中对 self 的使用一般都会将 s...

  • 2019-02-28

    网络请求回调的Block中,到底是用weakSelf还是用self?

  • swift基础-闭包

    一,Block的回顾 1,Block通常会用在网络请求中,请求到数据后然后回调,先自定义HttpTool的工具类实...

  • 多个网络请求

    在开发中,很容易遇到这样的需求,需要同时做多个网络请求,所有网络请求都完成后才能进行下一步的操作。如下载多个图片,...

  • IOS面试之block什么时候需要构造循环引用

    在网络请求API会持有回调的block,回调的block会持有self,而self也持有网络请求API的话,我们就...

  • block

    //block的原型: //基本使用 无返回值 //含有block参数的函数 比较常见的类型,如网络请求中的su...

  • 网络异步请求同步、顺序处理

    一、异步网络请求按顺序请求(信号量) 打印结果 二、多个网络异步请求最后同步(Group) 打印结果 三、多个网络...

  • iOS分组并发网络请求

    需求1:有多个网络请求,要求所有网络请求全部完成后,进行页面刷新等操作需求2:有多个网络请求,且要求网络请求顺序依...

网友评论

      本文标题:网络请求中,避免多个block错乱

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