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