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

2018-06-29  本文已影响0人  晨土飞扬

最近游戏项目有个需求,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响应头数据,这个数据量相当小,并不需要服务器返回响应体(文件数据),用同步方式相应很快,影响倒也不大,暂时可以解决这个需求的问题。

上一篇下一篇

猜你喜欢

热点阅读