美文网首页
点击tabbar跳转界面时莫名一个3秒的卡顿

点击tabbar跳转界面时莫名一个3秒的卡顿

作者: wustzhy | 来源:发表于2019-10-27 21:37 被阅读0次

    莫名一个3秒的卡顿

    当点击tabbarController的最后一个bar时,页面迟迟不切换过去,看console有部分打印信息正好是随着点击切换成功,看看时间差,足足3秒多才切换过去

    2019-10-26 15:03:41.371817+0800 yestin[281:7024] -[BaseNavigationController setNavigationBarHidden:animated:]
    ------- 0
    warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.
    2019-10-26 15:03:44.517337+0800 yestin[281:7231] -[PicDraftManager readInfo] 
     -------
    
    

    1、打开instrument,使用time profile打开app

    结果发现一切正常,秒切啊... 这...坑我呢

    2、console的log比较多,怀疑是NSLog导致的

    于是条件编译屏蔽一下NSLog

    #if ALLOW_NSLOG
        #define NSLog(...) NSLog(__VA_ARGS__)
    #else
        #define NSLog(...)
    #endif
    

    然而并不是,依然卡顿那么久

    3、搜了搜ios ,tabbarController点击 跳转 卡顿

    tabbar的Item间跳转出现界面卡顿问题

    TabBarController下NavigationController跳转回RootView卡顿

    一看这些个该是我所遭遇的情况了吧,but...一个个被我排除/❌ , 哎,继续研究吧

    4、逼我使用runloop监听了

    参考Tencent的GYMonitor,or戴铭的GCDFetchFeed (从中摘取SMLagMonitor

    结果把SMLagMonitor拖到空工程没事,拖到项目工程里就报错. 难题一个! 单独写fix过程,看这篇While building module 报错

    /Users/dl/Desktop/gitFiles/DearBaby/yestin/yestin/Expand/Macro/UIkitMacro.h:10:9: While building module 'UIKit' imported from /Users/dl/Desktop/gitFiles/DearBaby/yestin/yestin/Expand/Macro/UIkitMacro.h:10:
    >
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.4.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:9: While building module 'Foundation' imported from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.4.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:
    >
    /Users/dl/Desktop/gitFiles/DearBaby/yestin/<module-includes>:1:10: In file included from <module-includes>:1:
    >
    Showing All Errors Only
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.4.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:9: In file included from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.4.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:
    

    成功用上SMLagMonitor之后

    打印出一个耗时堆栈

    -[SMLagMonitor beginMonitor]_block_invoke_2 
     ------- Stack of thread: 771:
    CPU used: 46.0 percent
    user time: 0 second
    CoreFoundation                 0x180ea08cc <redacted> + 0
    UIKit                          0x18abf1b9c <redacted> + 1140
    yestin                     0x1008d7bfc -[UITableView(MJRefresh) mj_reloadData] + 28
    yestin                     0x1007c17b0 __62-[BaseRefreshTableViewController r_requestDataComplete:error:]_block_invoke + 260
    yestin                     0x10068bacc __58-[UserCenterViewController requestDataComplete:errorInfo:]_block_invoke + 612
    yestin                     0x1007964ec __72+[CHRequestManager(Account) requestUserInfoWithUid:onSucceeded:onError:]_block_invoke + 148
    yestin                     0x1007a21f8 __62+[CHRequestManager request:method:parameters:success:failure:]_block_invoke + 360
    yestin                     0x1007fba58 __61-[CHBaseRequest startWithCompletionBlockWithSuccess:failure:]_block_invoke + 432
    yestin                     0x100a15590 __48-[YTKNetworkAgent requestDidSucceedWithRequest:]_block_invoke + 216
    libdispatch.dylib              0x10821d1dc _dispatch_call_block_and_release + 24
    libdispatch.dylib              0x10821d19c _dispatch_client_callout + 16
    libdispatch.dylib              0x108221d2c _dispatch_main_queue_callback_4CF + 1180
    CoreFoundation                 0x180ec3070 <redacted> + 12
    CoreFoundation                 0x180ec0bc8 <redacted> + 2272
    CoreFoundation                 0x180de0da8 CFRunLoopRunSpecific + 552
    GraphicsServices               0x182dc6020 GSEventRunModal + 100
    UIKit                          0x18ae00758 UIApplicationMain + 236
    yestin                     0x1007c6e98 main + 88
    libdyld.dylib                  0x180871fc0 <redacted> + 4
    

    是这个requestUserInfoWithUid请求太慢的缘故?去掉这个后,发现仍然卡顿


    继续查看其它卡顿堆栈

    可能SMLagMonitor不太准吧,运行多次,经常是不同的堆栈如下, 出现以下经搜索和验证后不在因素范围内的东东

    libsystem_malloc.dylib
    // 这个明显搜不到与卡顿相关的
    
    libobjc.A.dylib
    // 这个倒能搜到与卡顿相关的,但我试了不行
    

    ...

    后来我打印卡顿界面的appear方法调用时间,于是搜索 willappear 和 didAppear之间 卡顿了好几秒

    这个和我一样卡顿好几秒的,但最后我的不属于这种情况,仍要继续探究

    5、删代码,一步步排除吧

    结果,当我使用如下结构作为window的rootViewController时
    UITabBarController
      | - UINavigationController
          |- UIViewController
      | - UINavigationController
          |- UIViewController
      | - UINavigationController
          |- UITableViewController

    只要第三个tabbar的nav的rootVCorvcUITableViewController or 添加了tableView的UIViewController ,当启动后第一次点击第3个tabbar就会卡顿好几秒才跳转成功。
    但是我新建一个工程,这样写就没有问题。

    难道是因为一些与VC/NavVC/UIScrollView相关的方法交换导致? 我试着都删除,仍然无解。至此研究了快一天了吧。


    研究不透,那只能以尽快解决问题为目的,回滚代码排查了

    6、回滚

    回滚到上周末的代码,build报错根据提示pod后发现依然无法运行

    SDWebImageCompat.h' file not found
    

    于是查查SDWebImage

    发现当初为引入阿里云的sdk,参照的阿里云demo这样pod的

    ## 阿里云视频
    #   视频录制
    pod 'MBProgressHUD', '~> 1.1.0'
    pod 'AFNetworking', '~> 3.0'
    pod 'SDWebImage', '~> 4.0'
    pod 'FMDB', '~> 2.5'
    pod 'JSONModel'
    pod 'LXReorderableCollectionViewFlowLayout'
    pod 'Nama-lite', '5.3.0'
    pod 'ZipArchive','1.4.0'
    pod 'AlivcConan', '0.9.5.1'     #短视频SDK依赖的数据埋点
    #      pod 'AliyunVideoSDKPro'   #短视频SDK(已经手动导入)
    

    问题就出在pod 'SDWebImage', '~> 4.0',因为我把之前的pod 'SDWebImage', '~> 5.0.6'给删除了,无脑直接copy了pod 'SDWebImage', '~> 4.0'

    ✔️ 于是改回pod 'SDWebImage', '~> 5.0.6'

    发现这样改之后,run,一顿操作,卡顿消失,简直不敢相信,再run,再测,感动人心时候终于来了,哈哈哈哈哈哈..... 累了一天后终于舒了一口气,


    心酸的一天... 焦躁的一天... 请有同样卡顿的同学,不要像我这么自虐的走研究卡顿的路线,直接跳到最后一步回滚代码,解决bug,先解决再研究。

    但看到这样的解决方式,我也不想再继续研究下去了。有心得的同学,帮忙留言告诉声哈 ~

    相关文章

      网友评论

          本文标题:点击tabbar跳转界面时莫名一个3秒的卡顿

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