美文网首页
iOS用信号量解决AFN请求同步问题

iOS用信号量解决AFN请求同步问题

作者: 王看山 | 来源:发表于2022-08-24 11:58 被阅读0次

return方法中需要用到同步请求数据的结果,但是网络请求返回block中又不能直接写return,因此想到用信号量来解决,实践一番,用信号量居然导致线程卡死了。追溯下卡死的原因:是因为AFN返回结果的blcok中,若没有设置其他线程,则默认主线程执行block内容,而此时的信号量等待把主线程给卡死了,主线程执行不下去,就gg了。

AFN源码:

AFN源码.png

解决办法:

- (NSString *)getDataA {
    __block NSString *dataTest = @"getDataA____信号量同步数据GG了!!!";
    //创建信号量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
    //记得信号量同步时给manager.completionQueue设置个队列,否则AFN默认block在主线程执行,此时设置信号量导致卡死
    manager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    NSURL *URL = [NSURL URLWithString:@"http://rap2api.taobao.org/app/mock/256798/api/chat/list"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        if (error) {
            NSLog(@"Error: %@", error);
        } else {
            NSLog(@"%@ %@", response, responseObject);
        }
        NSLog(@"DISPATCH_QUEUE_CONCURRENT___故障现象数据请求下来了哦,可以进行下一步了");
        dataTest = @"getDataA____信号量同步数据已经请求下来了!!!";
        dispatch_semaphore_signal(semaphore);
    }];
    [dataTask resume];
    //信号量等待
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"DISPATCH_QUEUE_CONCURRENT___进一步操作数据");
    return dataTest;
}

在此记录一下,看到的希望能帮到你。本篇GitHubDemo传送阵在此。

相关文章

  • iOS用信号量解决AFN请求同步问题

    return方法中需要用到同步请求数据的结果,但是网络请求返回block中又不能直接写return,因此想到用信号...

  • 最简单的iOS网络请求

    做iOS开发,说到网络请求,大家可能都不约而同的提到AFN,可以说大家的网络请求都是用AFN封装而成,AFN的强大...

  • iOS-三方库-AFNetworking

    一. AFN简介 1. HTTP请求解决方案 在iOS中,常见的发送HTTP请求(GET和POST)的解决方案有:...

  • iOS开发 AFN配置https请求

    iOS开发 AFN配置https请求

  • AFN同步请求

    项目需求:在 Block 中先发送网络请求,得到结果后再将请求结果返回 解决思路:用信号量是比较理想的解决方案,但...

  • AFN 同步请求

    需要把AFN的回调 放置在子线程 AFN的回调 默认在主线程,如果不把回调设置子线程, 那么 dispatch_s...

  • iOS HTTPS SSL

    iOS https 目前iOS大都是用的AFN来进行数据请求 正常请求 配置 逻辑处理 主要使用是在 AFUR...

  • AFN多请求依赖(二)

    导读:AFN多请求依赖(一) AFN多请求依赖(一)中解决的是如何将不同的AFN请求有序的进行请求:即第一个请求发...

  • iOS开发之使用信号量实现AFN请求同步

    好久没写文章了。。 忙碌的工作,一不小心就让我把这个好习惯给抛弃了。 也是自己不够毅力坚持吧。有人跟我说,写这些...

  • iOS网络请求传入数组

    iOS网络请求传入数组 之前做项目的时候,后台要求传入数组,用AFN传入字典,代码入下:

网友评论

      本文标题:iOS用信号量解决AFN请求同步问题

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