美文网首页
异步请求改写为同步请求

异步请求改写为同步请求

作者: IreneWang1988 | 来源:发表于2018-11-07 09:06 被阅读0次

1  使用nsurl se s si o n 进行异步请求,使用callback进行回调。但是有时候为了改写一些方法,需要在异步回调完成之后再进行后续操作,这个时候就需要用到信号量来进行同步请求的改写。具体例子如下:

异步:

- (void)HOAWithParameters:(NSMutableDictionary*)param

                callback:(void(^)(id))callback

{

    NSMutableString *baseURLString = [[NSMutableString alloc] initWithString:HOA_URL_PRO];

    [baseURLStringappendString:HOA_AUTH];

    NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:baseURLString]];

    [reqsetHTTPMethod:@"POST"];

    NSMutableDictionary *md5Dic = [[NSMutableDictionary alloc] initWithDictionary:param];

    NSData *paramData = [NSJSONSerialization dataWithJSONObject:md5Dic options:NSJSONWritingPrettyPrinted error:nil];

    NSString *paramString = [[NSString alloc] initWithData:paramData encoding:NSUTF8StringEncoding];

    req = [selfsetHeader:paramjsonString:paramStringrequest:req];

    [reqsetHTTPBody:paramData];

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];

    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:_opQueue];

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

            if(error) {

                callback(nil);

            }

            else{

                NSDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

                callback(dataDic);

            }

    }];

    [dataTaskresume];

}

调用这个异步方法的方法:

-(void)validateAuthTokenWithCallback:(void(^)(BOOLisSucceeded,id_Nullableresponse))callback{

    [[CMIOTHOAApi shareInstance] setServerPro:self.isServerPro];

    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:self.authToken,@"token", nil];

    [[CMIOTHOAApi shareInstance] HOAWithParameters:[params mutableCopy] callback:^(id response){

        if(response!=nil&& [[responseobjectForKey:@"resultCode"]intValue] ==0) {

             callback(YES,@"鉴权成功");

        }else{

              //NSString *errdes = [NSString stringWithFormat:@"鉴权失败 %@",self.authToken];

            callback(NO, response);

        }

    }];

}

采用 dispatch_semaphore_t match_sema = dispatch_semaphore_create(0); dispatch_semaphore_signal(match_sema);dispatch_semaphore_wait(match_sema, DISPATCH_TIME_FOREVER);来进行改写为同步方法的方法如下:

-(BOOL)validateAuthToken{

    [[CMIOTHOAApi shareInstance] setServerPro:self.isServerPro];

    dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    __blockBOOLisvalid =NO;

    dispatch_semaphore_t match_sema = dispatch_semaphore_create(0);

    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:self.authToken,@"token", nil];

    dispatch_async(quene, ^{

        [[CMIOTHOAApi shareInstance] HOAWithParameters:[params mutableCopy] callback:^(id response){

            if(response!=nil&& [[responseobjectForKey:@"resultCode"]intValue] ==0) {

                isvalid =YES;

                dispatch_semaphore_signal(match_sema);

            }else{

                isvalid =NO;

                dispatch_semaphore_signal(match_sema);

            }

        }];

    });

    dispatch_semaphore_wait(match_sema, DISPATCH_TIME_FOREVER);

    returnisvalid;

}

注意一点:   dispatch_semaphore_signal(match_sema); 和 dispatch_semaphore_wait(match_sema, DISPATCH_TIME_FOREVER); 必须要在不同的线程才不会照成死锁,否者一直调用不到 dispatch_semaphore_wait(match_sema, DISPATCH_TIME_FOREVER);方法。  

如果nsurl se s si o n  的da ta task 的回调放到了主线程,那么一定会死锁。 解决方案就是去掉回调的主线程代码。 

相关文章

  • 异步请求改写为同步请求

    1 使用nsurl se s si o n 进行异步请求,使用callback进行回调。但是有时候为了改写一些方法...

  • Okhttp3

    简介 配置 请求思路 get请求思路 post请求思路 get,post 同步和异步请求 异步请求(get) 同步...

  • 网络协议

    网络请求分为4类:GET同步请求GET异步请求POST同步请求POST异步请求 同步网络请求步骤: 1:创建网址字...

  • Ajax请求——异步请求原理的分析

    我们知道,ajax是一种异步请求的方式,想要了解异步请求,就必须要先从同步请求说起。 同步请求原理 常见的同步请求...

  • OKHTTP

    OKHTTP 引用 权限配置 测试URL 同步请求 异步请求 异步get请求 异步测试post请求 Retrofi...

  • 基于Spring框架实现异步请求与异步调用

    一、异步请求 1.1 同步请求与异步请求 首先看一下同步请求的线程执行模型: 接着看一下异步请求的线程执行模型: ...

  • Android知名三方库OKHttp(一) - 基本使用源码分析

    本文目标 搞明白OKHttp的源码同步请求和异步请求基本流程 基本使用 同步请求 异步请求 1.创建okHttpC...

  • 网络知识点回顾一

    同步请求和异步请求- 同步请求:阻塞式请求,会导致用户体验的中断- 异步请求:非阻塞式请求,不中断用户体验,百度地...

  • OkHttp源码(一)

    同步请求示例 异步请求示例 同步和异步调用只有在最后发起请求时有差别,前面构造OkHttpClient ,Requ...

  • okhttp分析

    okhttp使用分为同步请求和异步请求:异步请求: request是一个请求对像,包含了请求url,methord...

网友评论

      本文标题:异步请求改写为同步请求

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