iOS 异步请求的简单处理

作者: 找不到好的ID | 来源:发表于2017-09-20 00:42 被阅读90次

举例:比如A、B两个请求,B必须等待A完成才执行。像这种情况的话很多人都在A请求完成的回调里面写,这样是可以的,但是要实现同步的话还有两种方法,一个是 GCD 里面的 barrier 函数,另外一个是 GCD 里面信号量的方式,我觉得信号量的方式是更灵活的处理,代码入下:

 dispatch_semaphore_t semap = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [AFNetworking requestWithURLString:BASEURLWITH(@"login") 
                                parameters:@{@"email":@"fucc@gmail.com",
                                           @"password":@"xxxxxxx"} 
                                      type:HttpRequestTypePost 
                                   success:^(id responseObject) {
                                    NSLog(@"a完成");
                                   dispatch_semaphore_signal(semap);
                                 } failure:^(NSError *error) {
                                  NSLog(@"a完成,但是失败了");
                                   dispatch_semaphore_signal(semap); 
        }];
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //等待信号30s,如果超过30s的话,则进入 if 方法,否则就进入 else 方法
        //超时返回1
        if (dispatch_semaphore_wait(semap, dispatch_time(DISPATCH_TIME_NOW, 
                                   30 * NSEC_PER_SEC))) 
        {
            //处理超时
            //也可以把超时时间设置成forever,会一直等待直到收到信号
        }
        //不超时返回0
        else {
                [AFNetworking requestWithURLString:BASEURLWITH(@"login") 
                                    parameters:@{@"email":@"fucc@gmail.com",
                                                 @"password":@"xxxxxxx"} 
                                          type:HttpRequestTypePost 
                                       success:^(id responseObject) {
                                      NSLog(@"b完成");
                                     } failure:^(NSError *error) {
                                     NSLog(@"b完成,但是失败了"); 
                }];
             }
   });

举例:A、B、C三个请求,ABC都完成,并且成功再执行下一个动作。
错误示范:int i = 0,A 完成 i++,B 完成 i++, C完成 i++,然后在A、B、C三个请求的成功回调里,都进行判断 i==3,这样会出错的原因是,3个请求同时完成的话,i = 1。
正确示范代码入下:

    dispatch_group_t dispatchGroup = dispatch_group_create();
    dispatch_group_enter(dispatchGroup);
    NSLog(@"1");
    [AFNetworking requestWithURLString:BASEURLWITH(@"login1") 
                         parameters:@{@"email":@"fucc1@gmail.com",
                                    @"password":@"xxxxxxxx"} 
                               type:HttpRequestTypePost 
                            success:^(id responseObject) {
                                      NSLog(@"1完成");
                                      dispatch_group_leave(dispatchGroup);
                          } failure:^(NSError *error) {
                                      NSLog(@"%@",error);
    }];
    
   dispatch_group_enter(dispatchGroup);
   NSLog(@"2");
   [AFNetworking requestWithURLString:BASEURLWITH(@"login2") 
                         parameters:@{@"email":@"fucc2@gmail.com",
                                    @"password":@"xxxxxxxx"} 
                               type:HttpRequestTypePost 
                            success:^(id responseObject) {
                                      NSLog(@"2完成");
                                      dispatch_group_leave(dispatchGroup);
                          } failure:^(NSError *error) {
                                      NSLog(@"%@",error);
    }];
    
   dispatch_group_enter(dispatchGroup);
   NSLog(@"3");
   [AFNetworking requestWithURLString:BASEURLWITH(@"login3") 
                         parameters:@{@"email":@"fucc3@gmail.com",
                                    @"password":@"xxxxxxxx"} 
                               type:HttpRequestTypePost 
                            success:^(id responseObject) {
                                      NSLog(@"3完成");
                                      dispatch_group_leave(dispatchGroup);
                          } failure:^(NSError *error) {
                                      NSLog(@"%@",error);
    }];
    
    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
        NSLog(@"3个请求完成");
    });

相关文章

  • iOS 异步请求的简单处理

    举例:比如A、B两个请求,B必须等待A完成才执行。像这种情况的话很多人都在A请求完成的回调里面写,这样是可以的,但...

  • https请求处理方式:信任一切证书

    ios https请求处理方式1:信任一切证书 处理方法 1:使用异步请求方式 2:证书信任的委托这样处理 完整示...

  • IntentService和HandlerThread

    IntentService 概述 处理异步请求的Service 客户端使用startService()发送异步请求...

  • 异步

    异步 异步请求 同步请求:同一个请求由一个线程从头到尾进行处理 一步到位 异步请求:同一个请求中由多个线程进行处理...

  • 处理网路请求2-异步POST请求和同步请求

    本文目录一、异步POST请求二、NSURLConnection的其他请求方法 上一讲介绍了iOS中的异步GET请求...

  • 异步请求处理

    经常会有小伙伴问异步的问题,异步处理方案有很多,我来说一下我常用的。 背景:我们需要上传图片到oss,拿到oss返...

  • ios开发

    允许ios访问网络内容 发送异步请求网页内容显示在webview中 异步请求json,并且转成字典

  • iOS - NSURLConnection&&N

    一、NSURLConnection iOS7之后不建议使用 GET请求发送同步请求 发送异步请求 POST请求: ...

  • Antd Pro 与后端交互的几种场景(持更)

    Antd Pro如何处理异步请求? Antd Pro的异步请求用的是Dva,而Dva的异步又是在fetch的基础上...

  • Spring mvc之WebAsyncManager类

    用于管理异步请求处理的中心类,主要用作SPI,通常不由应用程序类直接使用。 异步场景从线程(T1)中的请求处理开始...

网友评论

    本文标题:iOS 异步请求的简单处理

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