@PEND
2020-04-13T09:20:52.000000Z
字数 29914
阅读 387
代码面试题
考察代码风格
除了各式还有别的什么问题吗?
//
// BaseViewController.m
//
//
// Created by A on 11-3-15.
// Copyright 2011 Company. All rights reserved.
//
import "BaseViewController.h"
import "AppDelegate.h"
import "FavoriteDataManager.h"
import "ReversePointDataManager.h"
import "SoftwareVersionManager.h"
import "BadgeChainManager.h"
import "CalloutView.h"
import "MiniCalloutView.h"
import "UserOpDataManager.h"
import "OfflineMapDataManager.h"
import "FavoriteViewController.h"
import "ConfigDataManager+OperationSystem.h"
import "StreetViewController.h"
import "StreetviewConfigDataManager.h"
import "UIAlertView+Swizzle.h"
import "IBaseViewStatusBarStyleProtocol.h"
import "PersonalInfoManager.h"
import "OfflineModeManager.h"
import "OfflineModeNetworkNotifyView.h"
import "LocalPOISearcher.h"
import "TrafficRestrictionController.h"
import "OperationFloatView.h"
import "SignInH5ViewController.h"
import "UIViewController+ForcePortait.h"
import "SkinDataManager.h"
import "MapViewFactory.h"
import "IndoorViewController.h"
import "CloseRoadDataFetcher.h"
import "OfflineMapViewController.h"
import "ActionSheet.h"
import "HomeWorkOverlay.h"
import "HomeWorkIconOverlay.h"
import "MySummaryViewController.h"
import "LanguagePackageViewController.h"
import "KingCardManager.h"
import "ThemePackageManager.h"
import "PoiOperationOverlay.h"
import "POISearchViewController.h"
import "PoiAnnotationPickerViewController.h"
import "PoiSearBarBaseView.h"
import "BaseBottomView.h"
import "RouteReqParam.h"
import "RouteViewController.h"
import "RouteSearchDefine.h"
import "PoiFullScreenWebViewController.h"
import "PoiAssociationView.h"
import "VCUpBottomMoveInOutTransition.h"
import "ViewController+Transition.h"
import "MapFloatLayerPanelView.h"
import "CarVioVcContainer.h"
import "UIUitl.h"
import <SDWebImage/SDWebImage.h>
import "BaseOpenApiManager.h"
import "RouteNavigationDataManager.h"
import "DriveNaviViewController.h"
import "BBPlistFileAccessor.h"
import "NearbyRecommendH5ViewController.h"
import "UgcReportEventDataManager.h"
import "UgcReportRecordDataManager.h"
import "UgcReportViewController.h"
import "UIViewController+BBHalfScreen.h"
import "BBUgcReportRecordsViewController.h"
import "BBVoiceAssistantManager+Carplay.h"
import "BBAttentionRealTimeBusManager.h"
import "BBLottieZipDataManager.h"
import "BBPersonCenterViewController.h"
import "RouteUtillity.h"
import "BBLottieBanner.h"
import "BBSearchVCTransition.h"
import "BBVoiceIntroduceView.h"
import "BBVoiceNoticeTips.h"
import "BBBusQRCodeModelManager.h"
import "BBVoiceEmitterView.h"
import "BBRegularBusDataManager.h"
import "BBCommuteDataManager.h"
import "CombineOfflineMapDataManager.h"
import "BaseViewController+BBOpeningAnimation.h"
import "CommuteConfirmViewController.h"
import "CommutePopViewController.h"
import "HistoryDataManager.h"
import "FullTimeDriverChoiceView.h"
import "FullTimeDriverManager.h"
import "NaviSettingLocalStore.h"
import "CommuteTool.h"
import "AdvSplashManager.h"
import "FloatLayerThemeDataManager.h"
import "THMWeatherAnimationView.h"
import "MainPageTipView.h"
import "HomepageWeatherDataManager.h"
import "ConfigDataManager+ThemeMap.h"
import "TMHomapageWeatherInfo.h"
import "BaseViewLocationReport.h"
import "RealTimeBusHomeModule.h"
import "RealTimeBusDataManager.h"
import "AccumWaterHippyViewController.h"
import "Device+Business.h"
import "BusActivityReportManager.h"
import "MainLocationButton.h"
import "SystemPrivacyManager.h"
import <LocationKit/LocationManager+AuthorizationStatus.h>
import "AccountAuthPopupViewController.h"
import <WeChatSDK/WXApi.h>
import "AdvSplashViewController.h"
define TABLEBAR_HEIGHT (([UIScreen mainScreen].bounds.size.height == 736)?54:48)
define MAPFLOATLAYERTAG 8888
define kSearchBarLeft (14)
define kAssociationTop (kNavigationBarHeight + (IS_IPHONE_6P ? 5 : 5.5))
//#define TEST_TTS_YYB
NSString *const ThemeCityNameInApp = @"ThemeCityName";
static CGFloat leftMargin = 6.5f;
static BOOL isShowHomeWork = NO;
static BOOL isAccumWaterTipsDidRequest = NO;
static NSInteger maxRealtimeLocationReportCount = 5;
NSMutableDictionary *splitURL(NSURL *url)
{
NSScanner *scanner = [NSScanner scannerWithString:url.absoluteString];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?/"]];
[scanner scanUpToString:@"?" intoString:nil]; //ignore the beginning of the string and skip to the vars
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
NSString *tempString;
while ([scanner scanUpToString:@"&" intoString:&tempString])
{
NSArray *keyValuePair = [tempString componentsSeparatedByString:@"="];
if ([keyValuePair count] == 2)
{
NSString *key = [[keyValuePair objectAtIndex:0] stringByRemovingPercentEncoding];
NSString *val = [[keyValuePair objectAtIndex:1] stringByRemovingPercentEncoding];
if (key != nil && val != nil)
{
[dictionary setValue:val forKey:key];
}
}
}
return dictionary;
}
BMapRect BMapRectMakeFromNSStringWithType(NSString *str) {
if (!NSStringIsNotEmpty(str)) {
return BMapRectMake(0, 0, 0, 0);
}
NSArray *components = [str componentsSeparatedByString:@","];
if (components.count != 4) {
return BMapRectMake(0, 0, 0, 0);
}
CLLocationCoordinate2D blCornor = CLLocationCoordinate2DMake([[components objectAtIndex:0] doubleValue], [[components objectAtIndex:1] doubleValue]);
CLLocationCoordinate2D trCornor = CLLocationCoordinate2DMake([[components objectAtIndex:2] doubleValue], [[components objectAtIndex:3] doubleValue]);
int blx = [CoordinateTransformer serverToClientX:[CoordinateTransformer longitudeToServerX:blCornor.longitude]];
int bly = [CoordinateTransformer serverToClientY:[CoordinateTransformer latitudeToServerY:blCornor.latitude]];
int trx = [CoordinateTransformer serverToClientX:[CoordinateTransformer longitudeToServerX:trCornor.longitude]];
int rty = [CoordinateTransformer serverToClientY:[CoordinateTransformer latitudeToServerY:trCornor.latitude]];
return BMapRectMake(blx, rty, trx-blx, bly-rty);
}
BMapPoint BMapPointMakeFromNSStringWithType(NSString *str) {
NSArray *components = [str componentsSeparatedByString:@","];
if(components.count != 2){
return BMapPointMake(0, 0);
}
int x = 0;
int y = 0;
CLLocationCoordinate2D coor = CLLocationCoordinate2DMake([[components objectAtIndex:0] doubleValue], [[components objectAtIndex:1] doubleValue]);
x = [CoordinateTransformer serverToClientX:[CoordinateTransformer longitudeToServerX:coor.longitude]];
y = [CoordinateTransformer serverToClientY:[CoordinateTransformer latitudeToServerY:coor.latitude]];
return BMapPointMake(x, y);
}
@interface BaseViewController()
<
UIGestureRecognizerDelegate,
IBaseViewStatusBarStyleProtocol,
OfflineModeNotifyViewDelegate,
LoginDelegate,
LocationDelegate,
PoiAnnotationPickerViewControllerDelegate,
PoiAssociationViewDelegate,
MapFloatLayerPanelViewDelegate,
LottieBannerDelegate,
UgcReportUIDelegate,
MainPageTipViewDelegate,
VoiceAssistantPanelViewDelegate,
HomeWorkOverlayDelegate,
CommuteDataManagerDelegate,
CommuteConfirmViewControllerDelegate,
CommutePopViewControllerDelegate,
RouteEditViewControllerDelegate,
TestFlightPopupViewControllerDelegate,
HomepageWeatherDelegate,
MWeatherAnimationViewDelegate,
RealTimeBusHomeModuleDelegate,
CloudControlQueryResultDelegate,
VoiceAssistantPanelViewDelegate
>
{
BOOL _isOpeningOfStreetView;
BOOL isViewDidAppear_;
BOOL longpressViewShow;
BOOL _hadFetchHolidayInfo;
dispatch_source_t nearbyHomePageTimer;
BMapPoint lastNearbyPoint;
BOOL _hideAssositeView;
FavoriteOverlay *favoriteOverlay_;
}
@property (nonatomic, strong) MainPageTipView *mainPageTipView;
@property (nonatomic, copy) void(^streetViewPresenterBlock)();
@property (nonatomic) BOOL isReviewAlertPoped;
@property (nullable, nonatomic, weak) AlertController *mapNotifyAlert;
@property (nonatomic, assign) BMapPoint previousCenter;
@property (nonatomic, strong) OperationFloatView *signInAlertView;
@property (nonatomic, strong) PoiSearBarBaseView *searchBarBaseView;
@property (nonatomic, strong) PoiAnnotationPickerViewController *poiAnnotationPickerViewController;
@property (nonatomic, strong) BaseBottomView *mBottomBarView;
@property (nonatomic, strong) PoiAssociationView *associationView;
@property (nonatomic, strong) LottieBanner *lottieBannerView;
@property (nonatomic, assign) NSInteger currentZoomLevel;
@property (nonatomic, weak) VoiceIntroduceView *voiceIntroduceView;
@property (nonatomic, weak) VoiceNoticeTips *voiceNoticeTips;
@property (nonatomic, weak) TestFlightPopupViewController *testFlightPopupVC;
@property (nonatomic, weak) AccountAuthPopupViewController *accountAuthPopupViewController;
@property (nonatomic, weak) AlertController *continueNavigationAlert;
@property (nonatomic, strong) BaseViewLocationReport *locationReport;
@property (nonatomic, strong) WeatherAnimationView *weatherAnimationView;
@property (nonatomic, strong) HomepageWeatherDataManager *weatherDataManager;
@property (nonatomic, strong) RealTimeBusHomeModule *realtimeBusHomeModule;
@property (nonatomic, assign) BOOL isFullViewMode;
@property (nonatomic, assign) CGRect searchBarFrame;
@property (nonatomic, assign) CGRect bottomBarFrame;
@property (nonatomic, assign) CGFloat realtimeBusLocationLogTime;
@property (nonatomic, assign) BOOL alreadyShownLocationAlertOnForeground;
@end
@implementation BaseViewController
@synthesize streetViewPresenterBlock = _streetViewPresenterBlock;
@synthesize isStatusBarHidden;
(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleWipeUpSearchResult:)
name:WipeUpSearchResultNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleWipeUpAllAnnotations:)
name:WipeUpAllAnnotationsNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleFocusAnnotation:)
name:FocusAnnotationNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleStartStreetviewFromPOIAnnotation:)
name:BaseStartStreetviewControllerFromPOINotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleShowMyLocation:)
name:ShowMyLocationNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(showFirstUseAlert:)
name:ShowFirstUseAlert
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onIntroductionViewWillDisappear)
name:IntroductionViewWillDisappearNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mapUseLeftHandChangeNotification:)
name:pUseLeftHandChangeNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(clearUI)
name:SetBaseViewModeNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleShowEventReportCard:) name:kBBNotifcationEventReportCardShowed object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cancelShowReviewAlert) name:BBBaseCancelShowReviewAlertNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOfflineModeCange:) name:KOfflineModeSettingsChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMapResourceUpdate:) name:BBMapResourceUpdateNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleBBCloseOtherUINotification:) name:BBCloseOtherUINotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netStateChangedNotification) name:BBNetworkStatusChangedNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleFollowMiniCardUpdate:) name:BBFollowMiniCardUpdateNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleWillEnterForegroundNotification:)
name:UIApplicationWillEnterForegroundNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleDidEnterBackgroundNotification:)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleFirstTimeLocationValidNotification:)
name:BBUserLocationTheFirstTimeValid
object:nil];
}
return self;
}
(BOOL)isHideNavigationBar
{
return YES; }
(void)dealloc
{
[[BBLocationManager defaultManager] removeDelegate:self];
[self unregisterKVO];
}
pragma mark - 首页运营词埋点
pragma mark - Select POI
(void)BBHomeWorkOverlay:(BBHomeWorkOverlay *)overlay didCommuteBubbleStateChanged:(BBCommuteBubbleViewState)state
{
if (state == BBCommuteBubbleViewStateBigBubble) {
[self closePoiPickerViewController];
}
}
(void)showCardWithPOI:(JsonPOIInfo *)poi {
[self showCardWithPOI:poi animation:NO];
}
(void)showCardWithPOI:(JsonPOIInfo *)poi animation:(BOOL)animation {
if (self.isFullViewMode) {
[self changeFullViewModeWithAnimation];
}
[[BBCalloutView sharedInstance] clear];
[[BBMiniCalloutView defaultCalloutView] clear];
[self.homeWorkOverlay setBubbleState:BBCommuteBubbleViewStateRemove];
// 是否展示选中的点 title
BOOL showTitle = YES;
if ([_homeWorkOverlay.annotationSet containsObject:poi]) {
showTitle = NO;
}
BBPoiAnnotationPickerViewController *annotationPickerViewController = [self startInitPoiAnnotationPickerViewController];
[annotationPickerViewController setCurrentAnnotation:poi annotations:nil mapview:self.baseView showTitle:showTitle animation:animation];
[self updateSelectedIndoorFloorId:poi];
[self showLongPressView];
}
pragma mark - 运营位
(void)reloadOperationData
{
[self checkShouldShowHomeBannerView];
[self checkShouldFetchHolidayInfo];
}
pragma mark - BBCloudControlQueryResultDelegate
(void)cloudControlQueryResultDidChange:(BBCloudControlQueryResult *)result
{
[self reloadOperationData];
}
pragma mark - SignInAlertView
// 首页浮窗数据拉取
(void)fetchHolidayInfo
{
if (![self isTopLevelView]) { // 只有4个tab的一级界面才发请求
return;
}
__weak typeof(self) weakSelf = self;
ClientLayerInfo *layerInfo = [[BBMWAConfigDataManager defaultManager] operationLayerInfoListWithPosistion:nil].firstObject;
if (layerInfo.layerUrl.length > 0 && [[BBMWAConfigDataManager defaultManager] layerCanShow]) {
_hadFetchHolidayInfo = YES;
SDWebImageManager *imageManager = [SDWebImageManager sharedManager];
[imageManager loadImageWithURL:[NSURL URLWithString:layerInfo.layerUrl]
options:SDWebImageRetryFailed
progress:nil
completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
if (image && layerInfo) {
strong
[weakSelf showPopupViewIfNeed];
}
}];
}
}
//浮层
(void)showPopupViewIfNeed
{
if (![self isHomePageMapViewShow]) {
return;
}
ClientLayerInfo *layerInfo = [[BBMWAConfigDataManager defaultManager] operationLayerInfoListWithPosistion:nil].firstObject;
SDImageCache *imageCache = [SDImageCache sharedImageCache];
UIImage *image = [imageCache imageFromDiskCacheForKey:layerInfo.layerUrl];
if (!image || !layerInfo) {
return;
}
if (self.signInAlertView) {
[self.signInAlertView dismiss];
self.signInAlertView = nil;
}
BBWeakSelf;
self.signInAlertView = [[BBOperationFloatView alloc] initWithLayerInfo:layerInfo image:image];
self.signInAlertView.detailButtonAction = ^void(BBOperationFloatView *alertView) {
BBStrongSelf;
NSURL *url = [NSURL URLWithString:layerInfo.actionUri];
BBOpenApiQuery *openApiQuery = [BBBaseOpenApiManager analysisOpenUrl:url];
NSString *scheme = openApiQuery.scheme;
if ([scheme hasPrefix:@"http"]) {
BBSignInH5ViewController *h5ViewController = [[BBSignInH5ViewController alloc] initWithImage:layerInfo holidayID:layerInfo.activityId];
h5ViewController.isPresented = YES;
BBNavigationController *navigationController = [[BBNavigationController alloc] initWithRootViewController:h5ViewController];
[[BBUIUitl currentViewController] presentViewController:navigationController animated:YES completion:nil];
}else {
[BBBaseOpenApiManager handleOpenUrl:url withNavigation:strongSelf.navigationController];
}
strongSelf.signInAlertView = nil;
};
self.signInAlertView.animation = BBOperationFloatViewAnimationNormal;
self.signInAlertView.closeButtonAction = ^(BBOperationFloatView *alertView) {
BBStrongSelf;
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
animation.values = @[[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.24f, 1.24f, 0)],
[NSValue valueWithCATransform3D:CATransform3DIdentity]];
animation.keyTimes = @[@(0.25f/(0.25f+0.33f)),@(1)];
[animation setDuration:0.25f+0.33f];
[animation setCalculationMode:kCAAnimationLinear];
strongSelf.signInAlertView = nil;
};
[self.signInAlertView showInView:self.view];
[[BBMWAConfigDataManager defaultManager] layerDidShow];
[self cancelShowReviewAlert];
}
(void)hidePopupViewIfNeed
{
if (self.signInAlertView) {
[self.signInAlertView dismiss];
}
}
pragma mark - 主题替换
(void)skinChange
{
[self changeLocationArrow:NO];
}
(void)changeLocationArrow:(BOOL)isAppear
{
SkinDataManager *skin = [SkinDataManager defaultManager];
self.baseView.userLocationView.pathForLocationImage = [skin skinLocateImagePathWithLocateType:SkinLocateDefault];
self.baseView.userLocationView.pathForFailurelocationImage = [skin skinLocateImagePathWithLocateType:SkinLocateInvalidDefault];
if (skin.locateCircleColor) {
self.baseView.userLocationView.circleColor = skin.locateCircleColor;
}
}
//----------------------------------------------------------
pragma mark - View lifecycle
(BOOL)shouldAutorotate
{
return YES;
}
(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
(void) gotoIndoorGuide
{
BBIndoorViewController *indoor = [[BBIndoorViewController alloc] init];
indoor.mapView = self.baseView;
indoor.centerPOI = JsonPOIInfo2FromBBPointInfo([self.baseView getActiveIndoorPOI]);
indoor.sourceType = kIndoorSourceTypeGuide;
[self.navigationController pushViewController:indoor animated:YES];
}
(void)setupAssociationView {
self.associationView = [BBPoiAssociationView viewWithScene:BBPoiAssociationViewSceneMain];
[_associationView setAssociatedMapView:self.baseView delegate:self];
_associationView.viewMode = AssociateViewAllMode;
_associationView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:_associationView];
}
(void)viewDidLoad
{
[super viewDidLoad];
[self appCanShowZoomView];
if (self.baseView == nil)
{
self.baseView = [BBMapViewFactory createMapViewWithFrame:self.view.bounds];
self.baseView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.baseView.delegate = self;
[self.baseView setMaxScale:MAX_SCALE_LEVEL_NORMAL];
self.baseView.nickName = @"首页";
[self registerKVO];
}
else
{
self.baseView.frame = self.view.bounds;
}
// 加载缓存
[self loadFromArchive];
self.baseView.allowsBackgroundLocationUpdates = YES;
[self.baseView showsUserLocation:YES withMapCenter:NO];
self.baseView.longPressedEnabled = YES;
self.baseView.mapUserLocationView.canShowCallout = YES;
[self resetMapViewFrame];
[self.view insertSubview:self.baseView atIndex:0];
[self setupAssociationView];
[self clearUI];
self.baseView.showTraffic = [BBPlistFileAccessor trafficSwitch];
self.baseView.sateliteMode = [[NSUserDefaults standardUserDefaults] boolForKey:kOptionShowSatelite];
BBWeakSelf;
self.searchBarFrame = CGRectMake(kSearchBarLeft, kBBStatusBarHeight + (IS_IPHONE_6P ? 4 : 5), self.view.width - 2*kSearchBarLeft, kBBPoiSearchBarHeight);
self.searchBarBaseView = [[BBPoiSearBarBaseView alloc] initWithFrame:_searchBarFrame];
[self.searchBarBaseView setupVoiceInputView:self action:@selector(onSearchBarAction:) voiceButtonBlock:^{
BBStrongSelf;
[strongSelf.voiceNoticeTips hide];
}];
self.searchBarBaseView.slideViewButtonBlock = ^{
BBStrongSelf;
[[BBBadgeChainManager defaultManager] tapOnBadge:BBBadgeRedPointAtAccount];
[strongSelf closeOtherUI];
[[UIApplication sharedApplication] keyWindow].backgroundColor = [UIColor whiteColor];
BBPersonCenterViewController *personVC = [[BBPersonCenterViewController alloc] init];
[personVC doEnterAnimationLikePresent:strongSelf];
if (![BBRegularBusDataManager defaultManager].isRegularBusSupport) {
[[BBRegularBusDataManager defaultManager] checkRegularBusUserSupport];
}
[strongSelf clearVoiceAssistant];
};
[self.view addSubview:self.searchBarBaseView];
self.bottomBarFrame = [self bottomBarDefaultFrame];
self.mBottomBarView = [[BBBaseBottomView alloc] initWithFrame:self.bottomBarFrame];
self.mBottomBarView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
self.mBottomBarView.baseNearBySearchBlock = ^(BMapPoint point, JsonPOIInfo *poi, CircumRecommendType rankingType, NSString *cityName) {
BBStrongSelf;
BBNearbyRecommendH5ViewController *circum = [[BBNearbyRecommendH5ViewController alloc] init];
circum.location = QCoordinateForMapPoint(point);
circum.poiInfo = poi;
circum.mapView = [BBMapView defaultMapView];
circum.cityName = cityName;
[[UIApplication sharedApplication] keyWindow].backgroundColor = [UIColor whiteColor];
CATransition *animation = [CATransition animation];
[animation setDuration:0.3];
[animation setType:kCATransitionMoveIn];
[animation setSubtype:kCATransitionFromTop];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
[strongSelf.navigationController.view.layer addAnimation:animation forKey:nil];
[strongSelf.navigationController pushViewController:circum animated:NO];
};
[self.view addSubview:self.mBottomBarView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleThemePackageChange:) name:kBBThemePackageThemeDidChangeNotification object:nil];
// 准备开屏动画数据
[self prepareOpeningAnimationIfNeeded];
}
(void)initAsyncMainThread {
// 基础
[self loadMapTextFontInfo];
[self initOverlays];
_useLeftHand = [[NSUserDefaults standardUserDefaults] boolForKey:KKeyUseLeftHand];
[self checkPOIMainSearBarWords];
// 数据初始化
[[FavoriteDataManager defaultManager] loadFromArchive];
[BBAttentionRealTimeBusManager defaultManager];
[[BBRegularBusDataManager defaultManager] checkRegularBusUserSupport];
// 界面初始化
[self showFreeFlowRedPointIfNeeded];
[self associateViewAdjustFrame];
[self showVoiceNoticeTipsIfNeed];
[self fetchOperationData];
[self showFullTimeDriverChoiceViewIfNeed];
}
(void)tipView:(BBMainPageTipView *)tipView clickType:(BBMainPageClickType)clickType {
switch (tipView.tipWeight) {
case BBMainPageTipWeightOfflineMap:
{
if (clickType == BBMainPageClickTypeResponse) {
[self jumpDownloadPage];
}
}
break;
case BBMainPageTipWeightOfflineMode:
{
if (clickType == BBMainPageClickTypeClose) {
}
}
break;
case BBMainPageTipWeightOfflinePrompt:
{
if (clickType == BBMainPageClickTypeAction) {
[self jumpStartOfflinePromptUpdate];
}
}
break;
default:
break;
}
if (![[BBVoiceAssistantManager defaultManager].panelViewManager isPanelViewShowing] && self.lottieBannerView) {
[self.lottieBannerView showIfNeeded];
}
[self associateViewAdjustFrame];
}
(void)tipView:(BBMainPageTipView *)tipView heightForTipText:(CGFloat)height {
if (!self.mainPageTipView.superview) {
[self.view insertSubview:self.mainPageTipView aboveSubview:self.associationView];
}
if (self.lottieBannerView) {
[self.lottieBannerView hideIfNeeded];
[self.view insertSubview:self.mainPageTipView aboveSubview:self.lottieBannerView];
}
if ([[BBVoiceAssistantManager defaultManager].panelViewManager isPanelViewShowing]) {
[self.mainPageTipView hideViewIfNeeded];
[self associateViewAdjustFrame];
}
}
(void)showLottieBannerWithLottieFileAtPath:(NSString *)filePath identify:(NSString *)identify bannerInfo:(ClientBannerInfo *)bannerInfo {
if (self.lottieBannerView) {
[self.lottieBannerView removeFromSuperview];
}
self.lottieBannerView = [[BBLottieBanner alloc] initWithFrame:CGRectMake(14, kBBNavigationBarHeight + 11, SCREEN_WIDTH - 28, 38)];
self.lottieBannerView.delegate = self;
BOOL ret = [self.lottieBannerView updateBannerWithLottieZipAtPath:filePath
actionUri:bannerInfo.actionUri
activityId:identify];
if (!ret) {
return;
}
[self.view insertSubview:self.lottieBannerView aboveSubview:self.associationView];
if (self.mainPageTipView.superview) {
[self.lottieBannerView hideIfNeeded];
[self.view insertSubview:self.lottieBannerView belowSubview:self.mainPageTipView];
}
if ([[BBVoiceAssistantManager defaultManager].panelViewManager isPanelViewShowing]) {
[self.lottieBannerView hideIfNeeded];
}
[[BBMWAConfigDataManager defaultManager] bannerDidShow:KHomeAdPosition];
[self associateViewAdjustFrame];
if (bannerInfo.autoClose > 0) {
BBWeakSelf;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(bannerInfo.autoClose * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
BBStrongSelf;
[strongSelf.lottieBannerView foldInfoLabel];
});
}
}
(void)hideTipAndBannerIfNeeded {
[self.mainPageTipView hideViewIfNeeded];
[self.lottieBannerView hideIfNeeded];
[self associateViewAdjustFrame];
}
(void)showTipAndBannerIfNeeded {
BOOL ret = [self.mainPageTipView showViewIfNeeded];
if (ret) {
[self.view insertSubview:self.mainPageTipView aboveSubview:self.associationView];
}
if (self.lottieBannerView) {
[self.lottieBannerView showIfNeeded];
if (ret) {
[self.view insertSubview:self.mainPageTipView aboveSubview:self.lottieBannerView];
}
}
[self associateViewAdjustFrame];
}
(void)checkShouldShowHomeBannerView {
ClientBannerInfo *bannerInfo = [[BBMWAConfigDataManager defaultManager] operationLottieZipBannerInfoWithPosition:KHomeAdPosition];
if (bannerInfo) {
BBWeakSelf;
[[BBLottieZipDataManager sharedInstance] downloadLottieZipWithUrl:bannerInfo.imgUrl identify:[bannerInfo identify] completeBlock:^(BOOL success, NSString *filePath, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
BBStrongSelf;
if (success && filePath.length && !strongSelf.isFullViewMode) {
[strongSelf showLottieBannerWithLottieFileAtPath:filePath identify:[bannerInfo identify] bannerInfo:bannerInfo];
}
});
}];
} else {
[[BBLottieZipDataManager sharedInstance] clearLastIdentify];
if (self.lottieBannerView) {
[self.lottieBannerView removeFromSuperview];
self.lottieBannerView.delegate = nil;
self.lottieBannerView = nil;
[self associateViewAdjustFrame];
}
}
}
(void)checkShouldFetchHolidayInfo {
if (!_hadFetchHolidayInfo) {
if ([NSThread isMainThread]) {
[self fetchHolidayInfo];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[self fetchHolidayInfo];
});
}
}
}
pragma mark - BBLottieBannerDelegate Method
(void)lottieBanner:(BBLottieBanner *)banner didSelectActionUrl:(NSURL *)url activityId:(NSString *)activityId {
[BBBaseOpenApiManager handleOpenUrl:url withNavigation:[BBUIUitl currentViewController].navigationController];
}
(void)lottieBannerDidFoldInfoLabel:(BBLottieBanner *)banner {
[self associateViewAdjustFrame];
}
(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:animated];
[self.baseView viewWillAppear];
isViewDidAppear_ = YES;
if ([SkinDataManager defaultManager].usingSkin && ![RouteNavigationDataManager defaultManager].isNavigating) {
[self changeLocationArrow:YES];
}
BOOL isShowTraffic = [BBPlistFileAccessor trafficSwitch];
[_associationView setTrafficStateButtonState:NO active:isShowTraffic];
self.baseView.showTraffic = isShowTraffic;
self.mBottomBarView.width = self.view.width;
self.mBottomBarView.isViewShowing = YES;
[self checkScenicAreaWithBlock:nil];
[self toggleOpeningAnimationIfNeeded];
[self.lottieBannerView playAnimationIfNeeded];
[self checkCommuteGuidancePopViewShow];
[self updateFavOverlayStatus];
if (self.isFullViewMode){
[self changeFullViewModeWithAnimation];
}
}
(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[BBMapViewFactory checkMapStack];
[self.baseView enableScaleAndLogoMode];
[self showOfflineModeTipsIfNeeded];
if (!_hadFetchHolidayInfo && [BBLocationManager defaultManager].locationAvailable) {
[self fetchHolidayInfo];
}
if([self isTopLevelView]){
[self checkOfflineMapRongHeStatus];
}
[self.baseView setMapIndoorActiveScreenArea:CGRectMake(0, 20+kBBNavigationBarHeight, self.baseView.width, self.baseView.height-20-kBBNavigationBarHeight-147)];
[[CloseRoadDataFetcher shareFetcher] setMainMapView:self.baseView showIcon:YES];
[[BBUgcReportEventDataManager sharedInstance] startRefreshDataWithMap:self.baseView];
[[BBUgcReportRecordDataManager sharedInstance] startRefreshRecord];
[[BBPageSceneManager sharedInstance] switchToScene:kPageSceneUnknown];
if ([[BBOfflineModeManager shareInstance] isInOfflineMode]) {
[self.voiceNoticeTips hide];
}
[self showTestFlightPopupIfNeeded];
[self showTestFlightStableVersionReleasedPopupIfNeeded];
}
(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[BBUgcReportEventDataManager sharedInstance] stopRefreshData];
[[BBUgcReportRecordDataManager sharedInstance] stopRefreshRecord];
[[CloseRoadDataFetcher shareFetcher] setMainMapView:nil];
self.mBottomBarView.isViewShowing = NO;
[self.lottieBannerView stopAnimationIfNeeded];
if (self.homeWorkOverlay.bubbleState == BBCommuteBubbleViewStateBigBubble) {
NSMutableDictionary *dict = [[BBCommuteDataManager defaultManager] reportDicWithType:BBCommuteBubbleDismissTypeOtherPage];
}
[self.homeWorkOverlay setBubbleState:BBCommuteBubbleViewStateRemove];
[self.realtimeBusHomeModule unregisterWithMapView:self.baseView];
[self dismissWeatherAnimation];
[self stopLocationReportIfNeed];
if (self.associationView.locationButton.trackingState == BBLocationButtonTrackingStateWaiting) {
self.associationView.locationButton.trackingState = BBLocationButtonTrackingStateNormal;
}
[[iFlyTTSManager defaultManager] stopPlayingTTSByRouteGuidance];
}
(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.baseView viewDidDisappear];
[self.voiceNoticeTips hide];
isViewDidAppear_ = NO;
}
(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
BOOL isPortrait = UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation);
if (!([RouteNavigationDataManager defaultManager].isNavigating && !isPortrait))
{
[[BBMapView defaultMapView] setCenterMoveRight:0];
}
self.searchBarBaseView.width = self.view.width - 2 * self.searchBarBaseView.left;
self.bottomBarFrame = [self bottomBarDefaultFrame];
}
@end
// main, 1
// main, 2
// 3
NSLog(@"%@, 1", [NSThread currentThread]);
dispatch_queue_t queue = dispatch_queue_create("com.test.queue", NULL);
dispatch_sync(queue, ^{
NSLog(@"%@, 2", [NSThread currentThread]);
});
NSLog(@"3");
// main, 1
// 3
// com.test.queue, 2
NSLog(@"%@, 1", [NSThread currentThread]);
dispatch_queue_t queue = dispatch_queue_create("com.test.queue", NULL);
dispatch_async(queue, ^{
NSLog(@"%@, 2", [NSThread currentThread]);
});
NSLog(@"3");
// main, 1
// main, 2
// 3
NSLog(@"%@, 1", [NSThread currentThread]);
dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
NSLog(@"%@, 2", [NSThread currentThread]);
});
NSLog(@"3");
// main, 1
// 3
// block1,block1,block2,block2 com.test.queue
NSLog(@"%@, 1", [NSThread currentThread]);
dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
NSLog(@"block1 %@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
NSLog(@"block2 %@", [NSThread currentThread]);
}
});
NSLog(@"3");
// main, 1
// 死锁
NSLog(@"%@, 1", [NSThread currentThread]);
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"%@, 2", [NSThread currentThread]);
});
NSLog(@"3");
// main, 1
// 3
// block1,block1,block2,block2,main
NSLog(@"%@, 1", [NSThread currentThread]);
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
NSLog(@"block1 %@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
NSLog(@"block2 %@", [NSThread currentThread]);
}
});
NSLog(@"3");