iOS獲取m3u8文件大小 2種方式 :一種是等待線程 一種是block回調(diào)
方法使用
第一種 等待線程
long long size = [TZGetUrlFileLength getUrlFileLength:str];
//size 為0 時(shí)地址m3u8有問(wèn)題,或者 中間ts段請(qǐng)求頭 有問(wèn)題。
第二種 block回調(diào)
[TZGetUrlFileLength getUrlFileLength:str withResultBlock:^(long long length, NSError * _Nonnull error) {
NSLog(@"size %lld ,error %@",length,error);
}];
方法展示
第一種 等待線程
/// 通過(guò)url (.m3u8)地址 獲取文件大小返回byte
/// @param url 地址m3u8類型
+(long long)getUrlFileLength:(NSString *)url;
{
if(url.length == 0 || ![url containsString:@"m3u8"]){
NSLog(@"url 地址不是m3u8 類型");
return 0;
}
NSError *error = nil;
NSString *m3u8DataStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error:&error];
if ( error ) {
NSLog( @"網(wǎng)絡(luò)錯(cuò)誤, 無(wú)法下載! 請(qǐng)檢查ATS||URL是否正確:%@",url);
return 0;
}
//獲取母地址 準(zhǔn)備拼接片段來(lái)獲取大小
__block NSString* urlStrTemp = [TZGetUrlFileLength getYichuTheLastStr:url];
//設(shè)置變量 記錄數(shù)值
__block long long size_zone = 0;
__block NSError * errorPost = nil;
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSArray<NSString *> *tsDataArr = [m3u8DataStr componentsSeparatedByString:@"\n"];
// 考慮線程安全 加一個(gè)
dispatch_semaphore_t signal = dispatch_semaphore_create(1);
for (int i = 0 ; i<tsDataArr.count; i++) {
NSString * strTs = [NSString stringWithFormat:@"%@",tsDataArr[i]];
if ([strTs hasSuffix:@".ts"]) {
// dispatch_async(queue, ^(){
// 拼接ts單片地址
NSString * urlPost = [NSString stringWithFormat:@"%@%@",urlStrTemp,strTs];
// 異步實(shí)現(xiàn)同步
dispatch_group_enter(group);
// 線程安全
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
// 判斷是否中間有失敗的場(chǎng)景
if (errorPost) {
size_zone = 0;
NSLog(@"任務(wù)中斷 %@",errorPost);
// 異步實(shí)現(xiàn)同步
dispatch_group_leave(group);
// 線程安全
dispatch_semaphore_signal(signal);
break;
}
//1.創(chuàng)建NSURLSession對(duì)象(可以獲取單例對(duì)象)
NSURLSession *session = [NSURLSession sharedSession];
//2.根據(jù)NSURLSession對(duì)象創(chuàng)建一個(gè)Task
NSURL *url = [NSURL URLWithString:urlPost];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.timeoutInterval = 5.0;
[request setHTTPMethod:@"HEAD"];
// 獲取內(nèi)容頭信息
NSURLSessionDataTask * dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
if (error) {
errorPost = error;
}
//拿到響應(yīng)頭信息
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
//獲取內(nèi)容大小
NSNumber *length = [[res allHeaderFields] objectForKey:@"Content-Length"];
// 記錄總量
size_zone = [length longLongValue] +size_zone;
// NSLog(@"length %lld, longZonetime222 %lld",[length longLongValue],size_zone);
// 異步實(shí)現(xiàn)同步
dispatch_group_leave(group);
// 線程安全
dispatch_semaphore_signal(signal);
// //4.解析拿到的響應(yīng)數(shù)據(jù)
// NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);
}];
//3.執(zhí)行Task
//注意:剛創(chuàng)建出來(lái)的task默認(rèn)是掛起狀態(tài)的,需要調(diào)用該方法來(lái)啟動(dòng)任務(wù)(執(zhí)行任務(wù))
[dataTask resume];
// NSLog(@"length , longZonetime111 %lld",size_zone);
// });
}
}
// 異步實(shí)現(xiàn)同步 等待完成任務(wù)返回?cái)?shù)值;
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"任務(wù)全部結(jié)束!longZonetime333 %lld",size_zone);
return size_zone;
}
第二種 block回調(diào)
/**
* 通過(guò)url獲得網(wǎng)絡(luò)的文件的大小 返回byte
*
* @param url 網(wǎng)絡(luò)url 地址m3u8類型
*
* 文件的大小 byte
*/
+(void)getUrlFileLength:(NSString *)url withResultBlock:(void(^)(long long length, NSError *error))block;
{
if(url.length == 0 || ![url containsString:@"m3u8"]){
NSLog(@"url 地址不是m3u8 類型");
if (block) {
block(0,nil);
}
return;
}
NSError *error = nil;
NSString *m3u8DataStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error:&error];
if ( error ) {
NSLog( @"網(wǎng)絡(luò)錯(cuò)誤, 無(wú)法下載! 請(qǐng)檢查ATS||URL是否正確:%@",url);
if (block) {
block(0,nil);
}
return;
}
//獲取母地址 準(zhǔn)備拼接片段來(lái)獲取大小
__block NSString* urlStrTemp = [TZGetUrlFileLength getYichuTheLastStr:url];
//設(shè)置變量 記錄數(shù)值
__block long long size_zone = 0;
__block NSError * errorPost = nil;
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSArray<NSString *> *tsDataArr = [m3u8DataStr componentsSeparatedByString:@"\n"];
// 考慮線程安全 加一個(gè)
dispatch_semaphore_t signal = dispatch_semaphore_create(1);
for (int i = 0 ; i<tsDataArr.count; i++) {
NSString * strTs = [NSString stringWithFormat:@"%@",tsDataArr[i]];
if ([strTs hasSuffix:@".ts"]) {
// 拼接ts單片地址
NSString * urlPost = [NSString stringWithFormat:@"%@%@",urlStrTemp,strTs];
// 異步實(shí)現(xiàn)同步
dispatch_group_enter(group);
// 線程安全
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
// 判斷是否中間有失敗的場(chǎng)景
if (errorPost) {
size_zone = 0;
NSLog(@"任務(wù)中斷 %@",errorPost);
// 異步實(shí)現(xiàn)同步
dispatch_group_leave(group);
// 線程安全
dispatch_semaphore_signal(signal);
break;
}
//1.創(chuàng)建NSURLSession對(duì)象(可以獲取單例對(duì)象)
NSURLSession *session = [NSURLSession sharedSession];
//2.根據(jù)NSURLSession對(duì)象創(chuàng)建一個(gè)Task
NSURL *url = [NSURL URLWithString:urlPost];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.timeoutInterval = 5.0;
[request setHTTPMethod:@"HEAD"];
// 獲取內(nèi)容頭信息
NSURLSessionDataTask * dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
if (error) {
errorPost = error;
}
//拿到響應(yīng)頭信息
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
//獲取內(nèi)容大小
NSNumber *length = [[res allHeaderFields] objectForKey:@"Content-Length"];
// 記錄總量
size_zone = [length longLongValue] +size_zone;
// NSLog(@"length %lld, longZonetime222 %lld",[length longLongValue],size_zone);
// 異步實(shí)現(xiàn)同步
dispatch_group_leave(group);
// 線程安全
dispatch_semaphore_signal(signal);
// //4.解析拿到的響應(yīng)數(shù)據(jù)
// NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);
}];
//3.執(zhí)行Task
//注意:剛創(chuàng)建出來(lái)的task默認(rèn)是掛起狀態(tài)的,需要調(diào)用該方法來(lái)啟動(dòng)任務(wù)(執(zhí)行任務(wù))
[dataTask resume];
//NSLog(@"length , longZonetime111 %lld",size_zone);
}
}
// NSLog(@"任務(wù)全部結(jié)束!longZonetime333 %lld",size_zone);
// 異步實(shí)現(xiàn)同步 等待完成任務(wù)返回?cái)?shù)值;
dispatch_group_notify(group, queue, ^{
NSLog(@"任務(wù)全部結(jié)束!longZonetime");
if (block) {
block(size_zone,errorPost);
}
});
}
補(bǔ)充方法
//獲取母地址 準(zhǔn)備拼接片段來(lái)獲取大小
+(NSString *)getYichuTheLastStr:(NSString *)url{
long i_temp = 0;
for (long i =url.length; i > 0; i--) {
NSString * str = [url substringWithRange:NSMakeRange(i-1, 1)];
if ([str isEqualToString:@"/"]) {
i_temp = i;
break;
}
}
//獲取母地址 準(zhǔn)備拼接片段來(lái)獲取大小
NSString* urlStrTemp = [url substringToIndex:i_temp];
return urlStrTemp;
}
不知道有沒有更好的方法 目前使用比較方法 整理下。