iOS获取服务器文件大小--同步方式

最近游戏项目有个需求,Unity开发组和iOS SDK组对接时,Unity申明一个函数,传过来一个文件下载的地址的参数,让iOS 对接组立即返回文件大小。


//和Unity交互文件中定义的获取文件大小的对接函数

long long FFGetFileBytes( const char* urlStr){


    }

接到这个需求,我认为用同步方式获取网络数据太不合适,但是需求是这样,Unity那边一时半会不好调整,只有先用同步方式获取,技术总监让我尝试下。

之前没有做过这种尝试,都是用AFNetworking异步方式请求。同步方式我印象中得用古老的NSURLConnection发送请求,第一次尝试用下面的方式获取:


+ (long long)fileBytesWithURLStr:(NSString*)urlStr;

{

    if ( urlStr.length == 0 )

    {

        return 0;

    }


    NSURL* URL = [NSURL URLWithString:urlStr ];

//创建请求对象
    NSMutableURLRequest* request = [[ NSMutableURLRequest alloc ] initWithURL:URL ];

//设置请求方式
    [request setHTTPMethod:@"GET"];

//接受返回的响应数据、错误信息
    NSHTTPURLResponse *resp = nil;
    NSError *err = nil;

//同步方式发送网络请求
    [NSURLConnection sendSynchronousRequest:request returningResponse:&resp error:&err];


    if (err != nil) {

        NSLog(@"===%@", err);

        return 0;

    }

//从响应头获取文件大小
    return resp.expectedContentLength;

}

采用这种方式问题就来了,线程卡住了。卡住线程的就是下面这句


[NSURLConnection sendSynchronousRequest:request returningResponse:&resp error:&err];

游戏资源文件都比较大,用3M左右的文件试了下,也会卡几秒钟,直到文件全部获取到才会往下执行。更不用说100多M甚至更大的文件了。

后来技术总监来查看了下我的代码,让我调整下请求方式,改用@“HEAD”:


[request setHTTPMethod:@"HEAD"];

HTTPMethod设置为@“HEAD”,只需要获取头文件。@“HEAD”方式以前从没用过,学习网络知识的时候@“GET”、@“POST”用得比较多,@“HEAD”只是稍微了解一点有这么个方式,并没有深究其用途。今天技术总监提醒了下,才恍然大悟。尝试了下,问题解决了。

@“HEAD”请求方式只是获取服务器返回的response响应头数据,这个数据量相当小,并不需要服务器返回响应体(文件数据),用同步方式相应很快,影响倒也不大,暂时可以解决这个需求的问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,767评论 8 265
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,098评论 2 89
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,171评论 1 32
  • 十岁那年 我和父亲二人 在一个叫鲫鱼塘的村子生活 劳累一天的父亲 喜欢在灶屋里默默吸烟 是自种的旱烟 也是中秋前一...
    第一闲人阅读 111评论 0 2
  • 每个人都这么忙,谁会管你是否孤寂 -01- 孤独是什么滋味? 在我大学毕业前,我想我都没有真正的认真思考过。而现...
    尼洱阅读 1,109评论 0 0