[关闭]
@PEND 2020-04-13T09:20:52.000000Z 字数 29914 阅读 332

以下代码有都什么问题

代码面试题


考察代码风格
除了各式还有别的什么问题吗?

  1. //
  2. // BaseViewController.m
  3. //
  4. //
  5. // Created by A on 11-3-15.
  6. // Copyright 2011 Company. All rights reserved.
  7. //
  8. import "BaseViewController.h"
  9. import "AppDelegate.h"
  10. import "FavoriteDataManager.h"
  11. import "ReversePointDataManager.h"
  12. import "SoftwareVersionManager.h"
  13. import "BadgeChainManager.h"
  14. import "CalloutView.h"
  15. import "MiniCalloutView.h"
  16. import "UserOpDataManager.h"
  17. import "OfflineMapDataManager.h"
  18. import "FavoriteViewController.h"
  19. import "ConfigDataManager+OperationSystem.h"
  20. import "StreetViewController.h"
  21. import "StreetviewConfigDataManager.h"
  22. import "UIAlertView+Swizzle.h"
  23. import "IBaseViewStatusBarStyleProtocol.h"
  24. import "PersonalInfoManager.h"
  25. import "OfflineModeManager.h"
  26. import "OfflineModeNetworkNotifyView.h"
  27. import "LocalPOISearcher.h"
  28. import "TrafficRestrictionController.h"
  29. import "OperationFloatView.h"
  30. import "SignInH5ViewController.h"
  31. import "UIViewController+ForcePortait.h"
  32. import "SkinDataManager.h"
  33. import "MapViewFactory.h"
  34. import "IndoorViewController.h"
  35. import "CloseRoadDataFetcher.h"
  36. import "OfflineMapViewController.h"
  37. import "ActionSheet.h"
  38. import "HomeWorkOverlay.h"
  39. import "HomeWorkIconOverlay.h"
  40. import "MySummaryViewController.h"
  41. import "LanguagePackageViewController.h"
  42. import "KingCardManager.h"
  43. import "ThemePackageManager.h"
  44. import "PoiOperationOverlay.h"
  45. import "POISearchViewController.h"
  46. import "PoiAnnotationPickerViewController.h"
  47. import "PoiSearBarBaseView.h"
  48. import "BaseBottomView.h"
  49. import "RouteReqParam.h"
  50. import "RouteViewController.h"
  51. import "RouteSearchDefine.h"
  52. import "PoiFullScreenWebViewController.h"
  53. import "PoiAssociationView.h"
  54. import "VCUpBottomMoveInOutTransition.h"
  55. import "ViewController+Transition.h"
  56. import "MapFloatLayerPanelView.h"
  57. import "CarVioVcContainer.h"
  58. import "UIUitl.h"
  59. import <SDWebImage/SDWebImage.h>
  60. import "BaseOpenApiManager.h"
  61. import "RouteNavigationDataManager.h"
  62. import "DriveNaviViewController.h"
  63. import "BBPlistFileAccessor.h"
  64. import "NearbyRecommendH5ViewController.h"
  65. import "UgcReportEventDataManager.h"
  66. import "UgcReportRecordDataManager.h"
  67. import "UgcReportViewController.h"
  68. import "UIViewController+BBHalfScreen.h"
  69. import "BBUgcReportRecordsViewController.h"
  70. import "BBVoiceAssistantManager+Carplay.h"
  71. import "BBAttentionRealTimeBusManager.h"
  72. import "BBLottieZipDataManager.h"
  73. import "BBPersonCenterViewController.h"
  74. import "RouteUtillity.h"
  75. import "BBLottieBanner.h"
  76. import "BBSearchVCTransition.h"
  77. import "BBVoiceIntroduceView.h"
  78. import "BBVoiceNoticeTips.h"
  79. import "BBBusQRCodeModelManager.h"
  80. import "BBVoiceEmitterView.h"
  81. import "BBRegularBusDataManager.h"
  82. import "BBCommuteDataManager.h"
  83. import "CombineOfflineMapDataManager.h"
  84. import "BaseViewController+BBOpeningAnimation.h"
  85. import "CommuteConfirmViewController.h"
  86. import "CommutePopViewController.h"
  87. import "HistoryDataManager.h"
  88. import "FullTimeDriverChoiceView.h"
  89. import "FullTimeDriverManager.h"
  90. import "NaviSettingLocalStore.h"
  91. import "CommuteTool.h"
  92. import "AdvSplashManager.h"
  93. import "FloatLayerThemeDataManager.h"
  94. import "THMWeatherAnimationView.h"
  95. import "MainPageTipView.h"
  96. import "HomepageWeatherDataManager.h"
  97. import "ConfigDataManager+ThemeMap.h"
  98. import "TMHomapageWeatherInfo.h"
  99. import "BaseViewLocationReport.h"
  100. import "RealTimeBusHomeModule.h"
  101. import "RealTimeBusDataManager.h"
  102. import "AccumWaterHippyViewController.h"
  103. import "Device+Business.h"
  104. import "BusActivityReportManager.h"
  105. import "MainLocationButton.h"
  106. import "SystemPrivacyManager.h"
  107. import <LocationKit/LocationManager+AuthorizationStatus.h>
  108. import "AccountAuthPopupViewController.h"
  109. import <WeChatSDK/WXApi.h>
  110. import "AdvSplashViewController.h"
  111. define TABLEBAR_HEIGHT (([UIScreen mainScreen].bounds.size.height == 736)?54:48)
  112. define MAPFLOATLAYERTAG 8888
  113. define kSearchBarLeft (14)
  114. define kAssociationTop (kNavigationBarHeight + (IS_IPHONE_6P ? 5 : 5.5))
  115. //#define TEST_TTS_YYB
  116. NSString *const ThemeCityNameInApp = @"ThemeCityName";
  117. static CGFloat leftMargin = 6.5f;
  118. static BOOL isShowHomeWork = NO;
  119. static BOOL isAccumWaterTipsDidRequest = NO;
  120. static NSInteger maxRealtimeLocationReportCount = 5;
  121. NSMutableDictionary *splitURL(NSURL *url)
  122. {
  123. NSScanner *scanner = [NSScanner scannerWithString:url.absoluteString];
  124. [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?/"]];
  125. [scanner scanUpToString:@"?" intoString:nil]; //ignore the beginning of the string and skip to the vars
  126. NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
  127. NSString *tempString;
  128. while ([scanner scanUpToString:@"&" intoString:&tempString])
  129. {
  130. NSArray *keyValuePair = [tempString componentsSeparatedByString:@"="];
  131. if ([keyValuePair count] == 2)
  132. {
  133. NSString *key = [[keyValuePair objectAtIndex:0] stringByRemovingPercentEncoding];
  134. NSString *val = [[keyValuePair objectAtIndex:1] stringByRemovingPercentEncoding];
  135. if (key != nil && val != nil)
  136. {
  137. [dictionary setValue:val forKey:key];
  138. }
  139. }
  140. }
  141. return dictionary;
  142. }
  143. BMapRect BMapRectMakeFromNSStringWithType(NSString *str) {
  144. if (!NSStringIsNotEmpty(str)) {
  145. return BMapRectMake(0, 0, 0, 0);
  146. }
  147. NSArray *components = [str componentsSeparatedByString:@","];
  148. if (components.count != 4) {
  149. return BMapRectMake(0, 0, 0, 0);
  150. }
  151. CLLocationCoordinate2D blCornor = CLLocationCoordinate2DMake([[components objectAtIndex:0] doubleValue], [[components objectAtIndex:1] doubleValue]);
  152. CLLocationCoordinate2D trCornor = CLLocationCoordinate2DMake([[components objectAtIndex:2] doubleValue], [[components objectAtIndex:3] doubleValue]);
  153. int blx = [CoordinateTransformer serverToClientX:[CoordinateTransformer longitudeToServerX:blCornor.longitude]];
  154. int bly = [CoordinateTransformer serverToClientY:[CoordinateTransformer latitudeToServerY:blCornor.latitude]];
  155. int trx = [CoordinateTransformer serverToClientX:[CoordinateTransformer longitudeToServerX:trCornor.longitude]];
  156. int rty = [CoordinateTransformer serverToClientY:[CoordinateTransformer latitudeToServerY:trCornor.latitude]];
  157. return BMapRectMake(blx, rty, trx-blx, bly-rty);
  158. }
  159. BMapPoint BMapPointMakeFromNSStringWithType(NSString *str) {
  160. NSArray *components = [str componentsSeparatedByString:@","];
  161. if(components.count != 2){
  162. return BMapPointMake(0, 0);
  163. }
  164. int x = 0;
  165. int y = 0;
  166. CLLocationCoordinate2D coor = CLLocationCoordinate2DMake([[components objectAtIndex:0] doubleValue], [[components objectAtIndex:1] doubleValue]);
  167. x = [CoordinateTransformer serverToClientX:[CoordinateTransformer longitudeToServerX:coor.longitude]];
  168. y = [CoordinateTransformer serverToClientY:[CoordinateTransformer latitudeToServerY:coor.latitude]];
  169. return BMapPointMake(x, y);
  170. }
  171. @interface BaseViewController()
  172. <
  173. UIGestureRecognizerDelegate,
  174. IBaseViewStatusBarStyleProtocol,
  175. OfflineModeNotifyViewDelegate,
  176. LoginDelegate,
  177. LocationDelegate,
  178. PoiAnnotationPickerViewControllerDelegate,
  179. PoiAssociationViewDelegate,
  180. MapFloatLayerPanelViewDelegate,
  181. LottieBannerDelegate,
  182. UgcReportUIDelegate,
  183. MainPageTipViewDelegate,
  184. VoiceAssistantPanelViewDelegate,
  185. HomeWorkOverlayDelegate,
  186. CommuteDataManagerDelegate,
  187. CommuteConfirmViewControllerDelegate,
  188. CommutePopViewControllerDelegate,
  189. RouteEditViewControllerDelegate,
  190. TestFlightPopupViewControllerDelegate,
  191. HomepageWeatherDelegate,
  192. MWeatherAnimationViewDelegate,
  193. RealTimeBusHomeModuleDelegate,
  194. CloudControlQueryResultDelegate,
  195. VoiceAssistantPanelViewDelegate
  196. >
  197. {
  198. BOOL _isOpeningOfStreetView;
  199. BOOL isViewDidAppear_;
  200. BOOL longpressViewShow;
  201. BOOL _hadFetchHolidayInfo;
  202. dispatch_source_t nearbyHomePageTimer;
  203. BMapPoint lastNearbyPoint;
  204. BOOL _hideAssositeView;
  205. FavoriteOverlay *favoriteOverlay_;
  206. }
  207. @property (nonatomic, strong) MainPageTipView *mainPageTipView;
  208. @property (nonatomic, copy) void(^streetViewPresenterBlock)();
  209. @property (nonatomic) BOOL isReviewAlertPoped;
  210. @property (nullable, nonatomic, weak) AlertController *mapNotifyAlert;
  211. @property (nonatomic, assign) BMapPoint previousCenter;
  212. @property (nonatomic, strong) OperationFloatView *signInAlertView;
  213. @property (nonatomic, strong) PoiSearBarBaseView *searchBarBaseView;
  214. @property (nonatomic, strong) PoiAnnotationPickerViewController *poiAnnotationPickerViewController;
  215. @property (nonatomic, strong) BaseBottomView *mBottomBarView;
  216. @property (nonatomic, strong) PoiAssociationView *associationView;
  217. @property (nonatomic, strong) LottieBanner *lottieBannerView;
  218. @property (nonatomic, assign) NSInteger currentZoomLevel;
  219. @property (nonatomic, weak) VoiceIntroduceView *voiceIntroduceView;
  220. @property (nonatomic, weak) VoiceNoticeTips *voiceNoticeTips;
  221. @property (nonatomic, weak) TestFlightPopupViewController *testFlightPopupVC;
  222. @property (nonatomic, weak) AccountAuthPopupViewController *accountAuthPopupViewController;
  223. @property (nonatomic, weak) AlertController *continueNavigationAlert;
  224. @property (nonatomic, strong) BaseViewLocationReport *locationReport;
  225. @property (nonatomic, strong) WeatherAnimationView *weatherAnimationView;
  226. @property (nonatomic, strong) HomepageWeatherDataManager *weatherDataManager;
  227. @property (nonatomic, strong) RealTimeBusHomeModule *realtimeBusHomeModule;
  228. @property (nonatomic, assign) BOOL isFullViewMode;
  229. @property (nonatomic, assign) CGRect searchBarFrame;
  230. @property (nonatomic, assign) CGRect bottomBarFrame;
  231. @property (nonatomic, assign) CGFloat realtimeBusLocationLogTime;
  232. @property (nonatomic, assign) BOOL alreadyShownLocationAlertOnForeground;
  233. @end
  234. @implementation BaseViewController
  235. @synthesize streetViewPresenterBlock = _streetViewPresenterBlock;
  236. @synthesize isStatusBarHidden;
  237. (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  238. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  239. if (self) {
  240. [[NSNotificationCenter defaultCenter] addObserver:self
  241. selector:@selector(handleWipeUpSearchResult:)
  242. name:WipeUpSearchResultNotification
  243. object:nil];
  244. [[NSNotificationCenter defaultCenter] addObserver:self
  245. selector:@selector(handleWipeUpAllAnnotations:)
  246. name:WipeUpAllAnnotationsNotification
  247. object:nil];
  248. [[NSNotificationCenter defaultCenter] addObserver:self
  249. selector:@selector(handleFocusAnnotation:)
  250. name:FocusAnnotationNotification
  251. object:nil];
  252. [[NSNotificationCenter defaultCenter] addObserver:self
  253. selector:@selector(handleStartStreetviewFromPOIAnnotation:)
  254. name:BaseStartStreetviewControllerFromPOINotification
  255. object:nil];
  256. [[NSNotificationCenter defaultCenter] addObserver:self
  257. selector:@selector(handleShowMyLocation:)
  258. name:ShowMyLocationNotification
  259. object:nil];
  260. [[NSNotificationCenter defaultCenter] addObserver:self
  261. selector:@selector(showFirstUseAlert:)
  262. name:ShowFirstUseAlert
  263. object:nil];
  264. [[NSNotificationCenter defaultCenter] addObserver:self
  265. selector:@selector(onIntroductionViewWillDisappear)
  266. name:IntroductionViewWillDisappearNotification
  267. object:nil];
  268. [[NSNotificationCenter defaultCenter] addObserver:self
  269. selector:@selector(mapUseLeftHandChangeNotification:)
  270. name:pUseLeftHandChangeNotification
  271. object:nil];
  272. [[NSNotificationCenter defaultCenter] addObserver:self
  273. selector:@selector(clearUI)
  274. name:SetBaseViewModeNotification
  275. object:nil];
  276. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleShowEventReportCard:) name:kBBNotifcationEventReportCardShowed object:nil];
  277. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cancelShowReviewAlert) name:BBBaseCancelShowReviewAlertNotification object:nil];
  278. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOfflineModeCange:) name:KOfflineModeSettingsChangeNotification object:nil];
  279. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMapResourceUpdate:) name:BBMapResourceUpdateNotification object:nil];
  280. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleBBCloseOtherUINotification:) name:BBCloseOtherUINotification object:nil];
  281. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netStateChangedNotification) name:BBNetworkStatusChangedNotification object:nil];
  282. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleFollowMiniCardUpdate:) name:BBFollowMiniCardUpdateNotification object:nil];
  283. [[NSNotificationCenter defaultCenter] addObserver:self
  284. selector:@selector(handleWillEnterForegroundNotification:)
  285. name:UIApplicationWillEnterForegroundNotification
  286. object:nil];
  287. [[NSNotificationCenter defaultCenter] addObserver:self
  288. selector:@selector(handleDidEnterBackgroundNotification:)
  289. name:UIApplicationDidEnterBackgroundNotification
  290. object:nil];
  291. [[NSNotificationCenter defaultCenter] addObserver:self
  292. selector:@selector(handleFirstTimeLocationValidNotification:)
  293. name:BBUserLocationTheFirstTimeValid
  294. object:nil];
  295. }
  296. return self;
  297. }
  298. (BOOL)isHideNavigationBar
  299. {
  300. return YES; }
  301. (void)dealloc
  302. {
  303. [[BBLocationManager defaultManager] removeDelegate:self];
  304. [self unregisterKVO];
  305. }
  306. pragma mark - 首页运营词埋点
  307. pragma mark - Select POI
  308. (void)BBHomeWorkOverlay:(BBHomeWorkOverlay *)overlay didCommuteBubbleStateChanged:(BBCommuteBubbleViewState)state
  309. {
  310. if (state == BBCommuteBubbleViewStateBigBubble) {
  311. [self closePoiPickerViewController];
  312. }
  313. }
  314. (void)showCardWithPOI:(JsonPOIInfo *)poi {
  315. [self showCardWithPOI:poi animation:NO];
  316. }
  317. (void)showCardWithPOI:(JsonPOIInfo *)poi animation:(BOOL)animation {
  318. if (self.isFullViewMode) {
  319. [self changeFullViewModeWithAnimation];
  320. }
  321. [[BBCalloutView sharedInstance] clear];
  322. [[BBMiniCalloutView defaultCalloutView] clear];
  323. [self.homeWorkOverlay setBubbleState:BBCommuteBubbleViewStateRemove];
  324. // 是否展示选中的点 title
  325. BOOL showTitle = YES;
  326. if ([_homeWorkOverlay.annotationSet containsObject:poi]) {
  327. showTitle = NO;
  328. }
  329. BBPoiAnnotationPickerViewController *annotationPickerViewController = [self startInitPoiAnnotationPickerViewController];
  330. [annotationPickerViewController setCurrentAnnotation:poi annotations:nil mapview:self.baseView showTitle:showTitle animation:animation];
  331. [self updateSelectedIndoorFloorId:poi];
  332. [self showLongPressView];
  333. }
  334. pragma mark - 运营位
  335. (void)reloadOperationData
  336. {
  337. [self checkShouldShowHomeBannerView];
  338. [self checkShouldFetchHolidayInfo];
  339. }
  340. pragma mark - BBCloudControlQueryResultDelegate
  341. (void)cloudControlQueryResultDidChange:(BBCloudControlQueryResult *)result
  342. {
  343. [self reloadOperationData];
  344. }
  345. pragma mark - SignInAlertView
  346. // 首页浮窗数据拉取
  347. (void)fetchHolidayInfo
  348. {
  349. if (![self isTopLevelView]) { // 只有4个tab的一级界面才发请求
  350. return;
  351. }
  352. __weak typeof(self) weakSelf = self;
  353. ClientLayerInfo *layerInfo = [[BBMWAConfigDataManager defaultManager] operationLayerInfoListWithPosistion:nil].firstObject;
  354. if (layerInfo.layerUrl.length > 0 && [[BBMWAConfigDataManager defaultManager] layerCanShow]) {
  355. _hadFetchHolidayInfo = YES;
  356. SDWebImageManager *imageManager = [SDWebImageManager sharedManager];
  357. [imageManager loadImageWithURL:[NSURL URLWithString:layerInfo.layerUrl]
  358. options:SDWebImageRetryFailed
  359. progress:nil
  360. completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
  361. if (image && layerInfo) {
  362. strong
  363. [weakSelf showPopupViewIfNeed];
  364. }
  365. }];
  366. }
  367. }
  368. //浮层
  369. (void)showPopupViewIfNeed
  370. {
  371. if (![self isHomePageMapViewShow]) {
  372. return;
  373. }
  374. ClientLayerInfo *layerInfo = [[BBMWAConfigDataManager defaultManager] operationLayerInfoListWithPosistion:nil].firstObject;
  375. SDImageCache *imageCache = [SDImageCache sharedImageCache];
  376. UIImage *image = [imageCache imageFromDiskCacheForKey:layerInfo.layerUrl];
  377. if (!image || !layerInfo) {
  378. return;
  379. }
  380. if (self.signInAlertView) {
  381. [self.signInAlertView dismiss];
  382. self.signInAlertView = nil;
  383. }
  384. BBWeakSelf;
  385. self.signInAlertView = [[BBOperationFloatView alloc] initWithLayerInfo:layerInfo image:image];
  386. self.signInAlertView.detailButtonAction = ^void(BBOperationFloatView *alertView) {
  387. BBStrongSelf;
  388. NSURL *url = [NSURL URLWithString:layerInfo.actionUri];
  389. BBOpenApiQuery *openApiQuery = [BBBaseOpenApiManager analysisOpenUrl:url];
  390. NSString *scheme = openApiQuery.scheme;
  391. if ([scheme hasPrefix:@"http"]) {
  392. BBSignInH5ViewController *h5ViewController = [[BBSignInH5ViewController alloc] initWithImage:layerInfo holidayID:layerInfo.activityId];
  393. h5ViewController.isPresented = YES;
  394. BBNavigationController *navigationController = [[BBNavigationController alloc] initWithRootViewController:h5ViewController];
  395. [[BBUIUitl currentViewController] presentViewController:navigationController animated:YES completion:nil];
  396. }else {
  397. [BBBaseOpenApiManager handleOpenUrl:url withNavigation:strongSelf.navigationController];
  398. }
  399. strongSelf.signInAlertView = nil;
  400. };
  401. self.signInAlertView.animation = BBOperationFloatViewAnimationNormal;
  402. self.signInAlertView.closeButtonAction = ^(BBOperationFloatView *alertView) {
  403. BBStrongSelf;
  404. CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
  405. animation.values = @[[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.24f, 1.24f, 0)],
  406. [NSValue valueWithCATransform3D:CATransform3DIdentity]];
  407. animation.keyTimes = @[@(0.25f/(0.25f+0.33f)),@(1)];
  408. [animation setDuration:0.25f+0.33f];
  409. [animation setCalculationMode:kCAAnimationLinear];
  410. strongSelf.signInAlertView = nil;
  411. };
  412. [self.signInAlertView showInView:self.view];
  413. [[BBMWAConfigDataManager defaultManager] layerDidShow];
  414. [self cancelShowReviewAlert];
  415. }
  416. (void)hidePopupViewIfNeed
  417. {
  418. if (self.signInAlertView) {
  419. [self.signInAlertView dismiss];
  420. }
  421. }
  422. pragma mark - 主题替换
  423. (void)skinChange
  424. {
  425. [self changeLocationArrow:NO];
  426. }
  427. (void)changeLocationArrow:(BOOL)isAppear
  428. {
  429. SkinDataManager *skin = [SkinDataManager defaultManager];
  430. self.baseView.userLocationView.pathForLocationImage = [skin skinLocateImagePathWithLocateType:SkinLocateDefault];
  431. self.baseView.userLocationView.pathForFailurelocationImage = [skin skinLocateImagePathWithLocateType:SkinLocateInvalidDefault];
  432. if (skin.locateCircleColor) {
  433. self.baseView.userLocationView.circleColor = skin.locateCircleColor;
  434. }
  435. }
  436. //----------------------------------------------------------
  437. pragma mark - View lifecycle
  438. (BOOL)shouldAutorotate
  439. {
  440. return YES;
  441. }
  442. (UIInterfaceOrientationMask)supportedInterfaceOrientations
  443. {
  444. return UIInterfaceOrientationMaskPortrait;
  445. }
  446. (void) gotoIndoorGuide
  447. {
  448. BBIndoorViewController *indoor = [[BBIndoorViewController alloc] init];
  449. indoor.mapView = self.baseView;
  450. indoor.centerPOI = JsonPOIInfo2FromBBPointInfo([self.baseView getActiveIndoorPOI]);
  451. indoor.sourceType = kIndoorSourceTypeGuide;
  452. [self.navigationController pushViewController:indoor animated:YES];
  453. }
  454. (void)setupAssociationView {
  455. self.associationView = [BBPoiAssociationView viewWithScene:BBPoiAssociationViewSceneMain];
  456. [_associationView setAssociatedMapView:self.baseView delegate:self];
  457. _associationView.viewMode = AssociateViewAllMode;
  458. _associationView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  459. [self.view addSubview:_associationView];
  460. }
  461. (void)viewDidLoad
  462. {
  463. [super viewDidLoad];
  464. [self appCanShowZoomView];
  465. if (self.baseView == nil)
  466. {
  467. self.baseView = [BBMapViewFactory createMapViewWithFrame:self.view.bounds];
  468. self.baseView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  469. self.baseView.delegate = self;
  470. [self.baseView setMaxScale:MAX_SCALE_LEVEL_NORMAL];
  471. self.baseView.nickName = @"首页";
  472. [self registerKVO];
  473. }
  474. else
  475. {
  476. self.baseView.frame = self.view.bounds;
  477. }
  478. // 加载缓存
  479. [self loadFromArchive];
  480. self.baseView.allowsBackgroundLocationUpdates = YES;
  481. [self.baseView showsUserLocation:YES withMapCenter:NO];
  482. self.baseView.longPressedEnabled = YES;
  483. self.baseView.mapUserLocationView.canShowCallout = YES;
  484. [self resetMapViewFrame];
  485. [self.view insertSubview:self.baseView atIndex:0];
  486. [self setupAssociationView];
  487. [self clearUI];
  488. self.baseView.showTraffic = [BBPlistFileAccessor trafficSwitch];
  489. self.baseView.sateliteMode = [[NSUserDefaults standardUserDefaults] boolForKey:kOptionShowSatelite];
  490. BBWeakSelf;
  491. self.searchBarFrame = CGRectMake(kSearchBarLeft, kBBStatusBarHeight + (IS_IPHONE_6P ? 4 : 5), self.view.width - 2*kSearchBarLeft, kBBPoiSearchBarHeight);
  492. self.searchBarBaseView = [[BBPoiSearBarBaseView alloc] initWithFrame:_searchBarFrame];
  493. [self.searchBarBaseView setupVoiceInputView:self action:@selector(onSearchBarAction:) voiceButtonBlock:^{
  494. BBStrongSelf;
  495. [strongSelf.voiceNoticeTips hide];
  496. }];
  497. self.searchBarBaseView.slideViewButtonBlock = ^{
  498. BBStrongSelf;
  499. [[BBBadgeChainManager defaultManager] tapOnBadge:BBBadgeRedPointAtAccount];
  500. [strongSelf closeOtherUI];
  501. [[UIApplication sharedApplication] keyWindow].backgroundColor = [UIColor whiteColor];
  502. BBPersonCenterViewController *personVC = [[BBPersonCenterViewController alloc] init];
  503. [personVC doEnterAnimationLikePresent:strongSelf];
  504. if (![BBRegularBusDataManager defaultManager].isRegularBusSupport) {
  505. [[BBRegularBusDataManager defaultManager] checkRegularBusUserSupport];
  506. }
  507. [strongSelf clearVoiceAssistant];
  508. };
  509. [self.view addSubview:self.searchBarBaseView];
  510. self.bottomBarFrame = [self bottomBarDefaultFrame];
  511. self.mBottomBarView = [[BBBaseBottomView alloc] initWithFrame:self.bottomBarFrame];
  512. self.mBottomBarView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
  513. self.mBottomBarView.baseNearBySearchBlock = ^(BMapPoint point, JsonPOIInfo *poi, CircumRecommendType rankingType, NSString *cityName) {
  514. BBStrongSelf;
  515. BBNearbyRecommendH5ViewController *circum = [[BBNearbyRecommendH5ViewController alloc] init];
  516. circum.location = QCoordinateForMapPoint(point);
  517. circum.poiInfo = poi;
  518. circum.mapView = [BBMapView defaultMapView];
  519. circum.cityName = cityName;
  520. [[UIApplication sharedApplication] keyWindow].backgroundColor = [UIColor whiteColor];
  521. CATransition *animation = [CATransition animation];
  522. [animation setDuration:0.3];
  523. [animation setType:kCATransitionMoveIn];
  524. [animation setSubtype:kCATransitionFromTop];
  525. [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
  526. [strongSelf.navigationController.view.layer addAnimation:animation forKey:nil];
  527. [strongSelf.navigationController pushViewController:circum animated:NO];
  528. };
  529. [self.view addSubview:self.mBottomBarView];
  530. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleThemePackageChange:) name:kBBThemePackageThemeDidChangeNotification object:nil];
  531. // 准备开屏动画数据
  532. [self prepareOpeningAnimationIfNeeded];
  533. }
  534. (void)initAsyncMainThread {
  535. // 基础
  536. [self loadMapTextFontInfo];
  537. [self initOverlays];
  538. _useLeftHand = [[NSUserDefaults standardUserDefaults] boolForKey:KKeyUseLeftHand];
  539. [self checkPOIMainSearBarWords];
  540. // 数据初始化
  541. [[FavoriteDataManager defaultManager] loadFromArchive];
  542. [BBAttentionRealTimeBusManager defaultManager];
  543. [[BBRegularBusDataManager defaultManager] checkRegularBusUserSupport];
  544. // 界面初始化
  545. [self showFreeFlowRedPointIfNeeded];
  546. [self associateViewAdjustFrame];
  547. [self showVoiceNoticeTipsIfNeed];
  548. [self fetchOperationData];
  549. [self showFullTimeDriverChoiceViewIfNeed];
  550. }
  551. (void)tipView:(BBMainPageTipView *)tipView clickType:(BBMainPageClickType)clickType {
  552. switch (tipView.tipWeight) {
  553. case BBMainPageTipWeightOfflineMap:
  554. {
  555. if (clickType == BBMainPageClickTypeResponse) {
  556. [self jumpDownloadPage];
  557. }
  558. }
  559. break;
  560. case BBMainPageTipWeightOfflineMode:
  561. {
  562. if (clickType == BBMainPageClickTypeClose) {
  563. }
  564. }
  565. break;
  566. case BBMainPageTipWeightOfflinePrompt:
  567. {
  568. if (clickType == BBMainPageClickTypeAction) {
  569. [self jumpStartOfflinePromptUpdate];
  570. }
  571. }
  572. break;
  573. default:
  574. break;
  575. }
  576. if (![[BBVoiceAssistantManager defaultManager].panelViewManager isPanelViewShowing] && self.lottieBannerView) {
  577. [self.lottieBannerView showIfNeeded];
  578. }
  579. [self associateViewAdjustFrame];
  580. }
  581. (void)tipView:(BBMainPageTipView *)tipView heightForTipText:(CGFloat)height {
  582. if (!self.mainPageTipView.superview) {
  583. [self.view insertSubview:self.mainPageTipView aboveSubview:self.associationView];
  584. }
  585. if (self.lottieBannerView) {
  586. [self.lottieBannerView hideIfNeeded];
  587. [self.view insertSubview:self.mainPageTipView aboveSubview:self.lottieBannerView];
  588. }
  589. if ([[BBVoiceAssistantManager defaultManager].panelViewManager isPanelViewShowing]) {
  590. [self.mainPageTipView hideViewIfNeeded];
  591. [self associateViewAdjustFrame];
  592. }
  593. }
  594. (void)showLottieBannerWithLottieFileAtPath:(NSString *)filePath identify:(NSString *)identify bannerInfo:(ClientBannerInfo *)bannerInfo {
  595. if (self.lottieBannerView) {
  596. [self.lottieBannerView removeFromSuperview];
  597. }
  598. self.lottieBannerView = [[BBLottieBanner alloc] initWithFrame:CGRectMake(14, kBBNavigationBarHeight + 11, SCREEN_WIDTH - 28, 38)];
  599. self.lottieBannerView.delegate = self;
  600. BOOL ret = [self.lottieBannerView updateBannerWithLottieZipAtPath:filePath
  601. actionUri:bannerInfo.actionUri
  602. activityId:identify];
  603. if (!ret) {
  604. return;
  605. }
  606. [self.view insertSubview:self.lottieBannerView aboveSubview:self.associationView];
  607. if (self.mainPageTipView.superview) {
  608. [self.lottieBannerView hideIfNeeded];
  609. [self.view insertSubview:self.lottieBannerView belowSubview:self.mainPageTipView];
  610. }
  611. if ([[BBVoiceAssistantManager defaultManager].panelViewManager isPanelViewShowing]) {
  612. [self.lottieBannerView hideIfNeeded];
  613. }
  614. [[BBMWAConfigDataManager defaultManager] bannerDidShow:KHomeAdPosition];
  615. [self associateViewAdjustFrame];
  616. if (bannerInfo.autoClose > 0) {
  617. BBWeakSelf;
  618. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(bannerInfo.autoClose * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  619. BBStrongSelf;
  620. [strongSelf.lottieBannerView foldInfoLabel];
  621. });
  622. }
  623. }
  624. (void)hideTipAndBannerIfNeeded {
  625. [self.mainPageTipView hideViewIfNeeded];
  626. [self.lottieBannerView hideIfNeeded];
  627. [self associateViewAdjustFrame];
  628. }
  629. (void)showTipAndBannerIfNeeded {
  630. BOOL ret = [self.mainPageTipView showViewIfNeeded];
  631. if (ret) {
  632. [self.view insertSubview:self.mainPageTipView aboveSubview:self.associationView];
  633. }
  634. if (self.lottieBannerView) {
  635. [self.lottieBannerView showIfNeeded];
  636. if (ret) {
  637. [self.view insertSubview:self.mainPageTipView aboveSubview:self.lottieBannerView];
  638. }
  639. }
  640. [self associateViewAdjustFrame];
  641. }
  642. (void)checkShouldShowHomeBannerView {
  643. ClientBannerInfo *bannerInfo = [[BBMWAConfigDataManager defaultManager] operationLottieZipBannerInfoWithPosition:KHomeAdPosition];
  644. if (bannerInfo) {
  645. BBWeakSelf;
  646. [[BBLottieZipDataManager sharedInstance] downloadLottieZipWithUrl:bannerInfo.imgUrl identify:[bannerInfo identify] completeBlock:^(BOOL success, NSString *filePath, NSError *error) {
  647. dispatch_async(dispatch_get_main_queue(), ^{
  648. BBStrongSelf;
  649. if (success && filePath.length && !strongSelf.isFullViewMode) {
  650. [strongSelf showLottieBannerWithLottieFileAtPath:filePath identify:[bannerInfo identify] bannerInfo:bannerInfo];
  651. }
  652. });
  653. }];
  654. } else {
  655. [[BBLottieZipDataManager sharedInstance] clearLastIdentify];
  656. if (self.lottieBannerView) {
  657. [self.lottieBannerView removeFromSuperview];
  658. self.lottieBannerView.delegate = nil;
  659. self.lottieBannerView = nil;
  660. [self associateViewAdjustFrame];
  661. }
  662. }
  663. }
  664. (void)checkShouldFetchHolidayInfo {
  665. if (!_hadFetchHolidayInfo) {
  666. if ([NSThread isMainThread]) {
  667. [self fetchHolidayInfo];
  668. } else {
  669. dispatch_async(dispatch_get_main_queue(), ^{
  670. [self fetchHolidayInfo];
  671. });
  672. }
  673. }
  674. }
  675. pragma mark - BBLottieBannerDelegate Method
  676. (void)lottieBanner:(BBLottieBanner *)banner didSelectActionUrl:(NSURL *)url activityId:(NSString *)activityId {
  677. [BBBaseOpenApiManager handleOpenUrl:url withNavigation:[BBUIUitl currentViewController].navigationController];
  678. }
  679. (void)lottieBannerDidFoldInfoLabel:(BBLottieBanner *)banner {
  680. [self associateViewAdjustFrame];
  681. }
  682. (void)viewWillAppear:(BOOL)animated {
  683. [super viewWillAppear:animated];
  684. [self.navigationController setNavigationBarHidden:YES animated:animated];
  685. [self.baseView viewWillAppear];
  686. isViewDidAppear_ = YES;
  687. if ([SkinDataManager defaultManager].usingSkin && ![RouteNavigationDataManager defaultManager].isNavigating) {
  688. [self changeLocationArrow:YES];
  689. }
  690. BOOL isShowTraffic = [BBPlistFileAccessor trafficSwitch];
  691. [_associationView setTrafficStateButtonState:NO active:isShowTraffic];
  692. self.baseView.showTraffic = isShowTraffic;
  693. self.mBottomBarView.width = self.view.width;
  694. self.mBottomBarView.isViewShowing = YES;
  695. [self checkScenicAreaWithBlock:nil];
  696. [self toggleOpeningAnimationIfNeeded];
  697. [self.lottieBannerView playAnimationIfNeeded];
  698. [self checkCommuteGuidancePopViewShow];
  699. [self updateFavOverlayStatus];
  700. if (self.isFullViewMode){
  701. [self changeFullViewModeWithAnimation];
  702. }
  703. }
  704. (void)viewDidAppear:(BOOL)animated
  705. {
  706. [super viewDidAppear:animated];
  707. [BBMapViewFactory checkMapStack];
  708. [self.baseView enableScaleAndLogoMode];
  709. [self showOfflineModeTipsIfNeeded];
  710. if (!_hadFetchHolidayInfo && [BBLocationManager defaultManager].locationAvailable) {
  711. [self fetchHolidayInfo];
  712. }
  713. if([self isTopLevelView]){
  714. [self checkOfflineMapRongHeStatus];
  715. }
  716. [self.baseView setMapIndoorActiveScreenArea:CGRectMake(0, 20+kBBNavigationBarHeight, self.baseView.width, self.baseView.height-20-kBBNavigationBarHeight-147)];
  717. [[CloseRoadDataFetcher shareFetcher] setMainMapView:self.baseView showIcon:YES];
  718. [[BBUgcReportEventDataManager sharedInstance] startRefreshDataWithMap:self.baseView];
  719. [[BBUgcReportRecordDataManager sharedInstance] startRefreshRecord];
  720. [[BBPageSceneManager sharedInstance] switchToScene:kPageSceneUnknown];
  721. if ([[BBOfflineModeManager shareInstance] isInOfflineMode]) {
  722. [self.voiceNoticeTips hide];
  723. }
  724. [self showTestFlightPopupIfNeeded];
  725. [self showTestFlightStableVersionReleasedPopupIfNeeded];
  726. }
  727. (void)viewWillDisappear:(BOOL)animated
  728. {
  729. [super viewWillDisappear:animated];
  730. [[BBUgcReportEventDataManager sharedInstance] stopRefreshData];
  731. [[BBUgcReportRecordDataManager sharedInstance] stopRefreshRecord];
  732. [[CloseRoadDataFetcher shareFetcher] setMainMapView:nil];
  733. self.mBottomBarView.isViewShowing = NO;
  734. [self.lottieBannerView stopAnimationIfNeeded];
  735. if (self.homeWorkOverlay.bubbleState == BBCommuteBubbleViewStateBigBubble) {
  736. NSMutableDictionary *dict = [[BBCommuteDataManager defaultManager] reportDicWithType:BBCommuteBubbleDismissTypeOtherPage];
  737. }
  738. [self.homeWorkOverlay setBubbleState:BBCommuteBubbleViewStateRemove];
  739. [self.realtimeBusHomeModule unregisterWithMapView:self.baseView];
  740. [self dismissWeatherAnimation];
  741. [self stopLocationReportIfNeed];
  742. if (self.associationView.locationButton.trackingState == BBLocationButtonTrackingStateWaiting) {
  743. self.associationView.locationButton.trackingState = BBLocationButtonTrackingStateNormal;
  744. }
  745. [[iFlyTTSManager defaultManager] stopPlayingTTSByRouteGuidance];
  746. }
  747. (void)viewDidDisappear:(BOOL)animated
  748. {
  749. [super viewDidDisappear:animated];
  750. [self.baseView viewDidDisappear];
  751. [self.voiceNoticeTips hide];
  752. isViewDidAppear_ = NO;
  753. }
  754. (void)viewDidLayoutSubviews
  755. {
  756. [super viewDidLayoutSubviews];
  757. BOOL isPortrait = UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation);
  758. if (!([RouteNavigationDataManager defaultManager].isNavigating && !isPortrait))
  759. {
  760. [[BBMapView defaultMapView] setCenterMoveRight:0];
  761. }
  762. self.searchBarBaseView.width = self.view.width - 2 * self.searchBarBaseView.left;
  763. self.bottomBarFrame = [self bottomBarDefaultFrame];
  764. }
  765. @end
  766. // main, 1
  767. // main, 2
  768. // 3
  769. NSLog(@"%@, 1", [NSThread currentThread]);
  770. dispatch_queue_t queue = dispatch_queue_create("com.test.queue", NULL);
  771. dispatch_sync(queue, ^{
  772. NSLog(@"%@, 2", [NSThread currentThread]);
  773. });
  774. NSLog(@"3");
  775. // main, 1
  776. // 3
  777. // com.test.queue, 2
  778. NSLog(@"%@, 1", [NSThread currentThread]);
  779. dispatch_queue_t queue = dispatch_queue_create("com.test.queue", NULL);
  780. dispatch_async(queue, ^{
  781. NSLog(@"%@, 2", [NSThread currentThread]);
  782. });
  783. NSLog(@"3");
  784. // main, 1
  785. // main, 2
  786. // 3
  787. NSLog(@"%@, 1", [NSThread currentThread]);
  788. dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);
  789. dispatch_sync(queue, ^{
  790. NSLog(@"%@, 2", [NSThread currentThread]);
  791. });
  792. NSLog(@"3");
  793. // main, 1
  794. // 3
  795. // block1,block1,block2,block2 com.test.queue
  796. NSLog(@"%@, 1", [NSThread currentThread]);
  797. dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);
  798. dispatch_async(queue, ^{
  799. for (int i = 0; i < 2; i++) {
  800. NSLog(@"block1 %@", [NSThread currentThread]);
  801. }
  802. });
  803. dispatch_async(queue, ^{
  804. for (int i = 0; i < 2; i++) {
  805. NSLog(@"block2 %@", [NSThread currentThread]);
  806. }
  807. });
  808. NSLog(@"3");
  809. // main, 1
  810. // 死锁
  811. NSLog(@"%@, 1", [NSThread currentThread]);
  812. dispatch_queue_t queue = dispatch_get_main_queue();
  813. dispatch_sync(queue, ^{
  814. NSLog(@"%@, 2", [NSThread currentThread]);
  815. });
  816. NSLog(@"3");
  817. // main, 1
  818. // 3
  819. // block1,block1,block2,block2,main
  820. NSLog(@"%@, 1", [NSThread currentThread]);
  821. dispatch_queue_t queue = dispatch_get_main_queue();
  822. dispatch_async(queue, ^{
  823. for (int i = 0; i < 2; i++) {
  824. NSLog(@"block1 %@", [NSThread currentThread]);
  825. }
  826. });
  827. dispatch_async(queue, ^{
  828. for (int i = 0; i < 2; i++) {
  829. NSLog(@"block2 %@", [NSThread currentThread]);
  830. }
  831. });
  832. NSLog(@"3");
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注