You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
4.3 KiB
Objective-C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//
// NetWatcher.m
// TXLiteAVDemo
//
// Created by annidyfeng on 2018/7/31.
// Copyright © 2018年 Tencent. All rights reserved.
//
#import "NetWatcher.h"
#import "AFNetworking/AFNetworking.h"
#import "SuperPlayerModelInternal.h"
@interface NetWatcher()
@property NSArray *definitions;
@end
@implementation NetWatcher {
NSDate *_startTime;
int _loadingCount;
dispatch_source_t _timer1;
BOOL _onFire;
}
- (void)setPlayerModel:(SuperPlayerModel *)playerModel
{
_playerModel = playerModel;
self.definitions = [self.playerModel.playDefinitions sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
return [NetWatcher weightOfDefinition:obj1] < [NetWatcher weightOfDefinition:obj2];
}];
if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN) {
self.adviseDefinition = self.definitions.lastObject;
} else {
self.adviseDefinition = self.definitions.firstObject;
}
}
- (void)startWatch
{
[self stopWatch];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
if (self.definitions.count <= 1) {
return;
}
_startTime = [NSDate date];
_loadingCount = 0;
NSLog(@"NetWatcher: startWatch");
}
- (void)stopWatch
{
_startTime = nil;
if (_timer1) {
if (!_onFire) {
dispatch_resume(_timer1);
}
dispatch_source_cancel(_timer1);
_timer1 = nil;
}
_onFire = NO;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)loadingEvent
{
if (!_startTime)
return;
NSLog(@"NetWatcher: loadingEvent");
if (_timer1 == nil) {
_timer1 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
dispatch_source_set_timer(_timer1, DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
__weak NetWatcher *weakSelf = self;
dispatch_source_set_event_handler(_timer1, ^{
NetWatcher *strongSelf = weakSelf;
NSLog(@"NetWatcher: time out");
if (strongSelf) {
strongSelf->_loadingCount++;
[strongSelf testNotify];
}
});
}
if (!_onFire) {
dispatch_resume(_timer1);
}
_onFire = YES;
}
- (void)loadingEndEvent
{
if (_onFire) {
dispatch_suspend(_timer1);
_onFire = NO;
_loadingCount++;
}
NSLog(@"NetWatcher: loadingEndEvent");
}
- (BOOL)testNotify
{
if (-[_startTime timeIntervalSinceNow] > 30) {
[self stopWatch]; // 超过30秒不检测了
return NO;
}
// 暂定30秒缓冲次数超过2次为网络不好
if (_loadingCount >= 2) {
NSUInteger i = [self.definitions indexOfObject:self.adviseDefinition];
if (i < self.definitions.count-1) {
self.adviseDefinition = self.definitions[i+1];
}
if (self.notifyTipsBlock) {
self.notifyTipsBlock(@"检测到你的网络较差,建议切换清晰度");
}
_loadingCount = 0;
[self stopWatch];
return YES;
}
return NO;
}
- (void)networkChanged:(NSNotification *)noti
{
if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN) {
self.adviseDefinition = self.definitions.lastObject;
if (self.adviseDefinition && ![self.playerModel.playingDefinition isEqualToString:self.adviseDefinition]) {
self.notifyTipsBlock([@"当前网络为4G建议切换到" stringByAppendingString:self.adviseDefinition]);
}
}
}
+(int)weightOfDefinition:(NSString *)def
{
if ([def isEqualToString:@"流畅"]) {
return 10;
}
if ([def isEqualToString:@"标清"]) {
return 15;
}
if ([def isEqualToString:@"高清"]) {
return 20;
}
if ([def isEqualToString:@"全高清"]) {
return 40;
}
if ([def isEqualToString:@"超清"]) {
return 50;
}
if ([def isEqualToString:@"原画"]) {
return 60;
}
if ([def isEqualToString:@"2K"]) {
return 70;
}
if ([def isEqualToString:@"4K"]) {
return 80;
}
return 10000;
}
@end