美文网首页
iOS获取服务器文件大小--同步方式

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

作者: 晨土飞扬 | 来源:发表于2018-06-29 10:22 被阅读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响应头数据,这个数据量相当小,并不需要服务器返回响应体(文件数据),用同步方式相应很快,影响倒也不大,暂时可以解决这个需求的问题。

    相关文章

      网友评论

          本文标题:iOS获取服务器文件大小--同步方式

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