从后台线程调用动画 +UIView setAnimationsEnabled 错误 [英] Animation +UIView setAnimationsEnabled being called from a background thread Error

查看:67
本文介绍了从后台线程调用动画 +UIView setAnimationsEnabled 错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序中显示初始视图控制器,直到登录完成.登录成功后,我尝试使用 AppDelegate 类中的以下代码显示我的主 ViewController.它仅正确显示视图控制器,但显示错误.我可能在代码中犯了一些错误.

我希望我的 Main ViewController viewWillAppear() 仅在我在 AppDelegate 中所做的所有工作完成后才被调用.

AppDelegate 类

class AppDelegate: UIResponder, UIApplicationDelegate {变量窗口:UIWindow?func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) ->布尔{//在应用程序启动后覆盖自定义点.打印(内部应用程序委托")self.window = UIWindow(frame: UIScreen.main.bounds)self.initializeAppViewState()LoginManager.shared.login() {(成功)->作废如果成功{print("登录成功")self.setupRootViewController()} 别的 {print("登录失败")}}返回真}func applicationWillResignActive(_ application: UIApplication) {}func applicationDidEnterBackground(_ application: UIApplication) {}func applicationWillEnterForeground(_ application: UIApplication) {}func applicationDidBecomeActive(_ application: UIApplication) {}func applicationWillTerminate(_ application: UIApplication) {}func initializeAppViewState() {如果(!Thread.isMainThread){DispatchQueue.main.async {self.initializeAppViewState()}返回}self.window!.rootViewController = InitialViewController(nibName: "InitialViewController", bundle: Bundle.main)self.window!.makeKeyAndVisible()}func setupRootViewController() {让 storyboard = UIStoryboard(name: "Main", bundle: nil)让 viewController = storyboard.instantiateViewController(withIdentifier :"NavigationController") 作为!导航控制器如果让 window = self.window,让 rootViewController = window.rootViewController {var currentController = rootViewController而让presentedController = currentController.presentedViewController {currentController =presentedController}currentController.present(viewController,动画:true,完成:nil)}}}

下面是我得到的错误

<前>登陆成功2019-10-03 20:49:00.707020+0530 IoT Simulator[47491:1653133] [Animation] +[UIView setAnimationsEnabled:] 从后台线程调用.不支持从 UIView 或子类的后台线程执行任何操作,并且可能会导致意外和阴险的行为.痕迹=(0 UIKitCore 0x0000000111b7bdda kFixedAnimationDuration_block_invoke_5 + 1071 libdispatch.dylib 0x000000011016cdb5 _dispatch_client_callout + 82 libdispatch.dylib 0x000000011016e83c _dispatch_once_callout + 663 UIKitCore 0x0000000111b7bd6d +[UIView(Animation) setAnimationsEnabled:] + 764 UIKitCore 0x0000000111b7bebb +[UIView(Animation) performWithoutAnimation:] + 845 UIKitCore 0x0000000110e06d46 -[UIVisualEffectView _updateSubviews] + 3256 UIKitCore 0x0000000110e07b56 -[UIVisualEffectView _configureAllEffects] + 14357 UIKitCore 0x0000000110e05fe5 -[UIVisualEffectView setBackgroundEffects:] + 3968 UIKitCore 0x0000000110e100ee -[_UIBarBackground updateBackground] + 2299 UIKitCore 0x0000000110e1039d -[_UIBarBackground transitionBackgroundViews] + 20810 UIKitCore 0x0000000110e99bde -[_UINavigationBarVisualProviderModernIOS _updateBackgrounds] + 85011 UIKitCore 0x0000000110e99e20 -[_UINavigationBarVisualProviderModernIOS layoutSubviews] + 27212 UIKitCore 0x0000000110e4ee4c -[UINavigationBar layoutSubviews] + 25613 UIKitCore 0x0000000111b89e69 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 141714 UIKitCore 0x0000000110e4eba4 -[UINavigationBar layoutSublayersOfLayer:] + 24815 QuartzCore 0x000000011310cd22 -[CALayer layoutSublayers] + 17316 QuartzCore 0x00000001131119fc _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 39617 UIKitCore 0x0000000111b74e2d -[UIView(Hierarchy) layoutBelowIfNeeded] + 64618 UIKitCore 0x0000000110ffa271 -[UINavigationController _positionNavigationBarHidden:edge:initialOffset:] + 80019 UIKitCore 0x0000000110ffa4f0 -[UINavigationController _positionNavigationBarHidden:edge:] + 38820 UIKitCore 0x000000011100149d -[UINavigationController loadView] + 23921 UIKitCore 0x00000001110a7d04 -[UIViewController loadViewIfRequired] + 17222 UIKitCore 0x00000001110a8524 -[UIViewController 视图] + 2723 UIKitCore 0x0000000110fcf5b4 -[_UIFullscreenPresentationController _setPresentedViewController:] + 8924 UIKitCore 0x0000000110fc36aa -[UIPresentationController initWithPresentedViewController:presentingViewController:] + 13325 UIKitCore 0x00000001110bb18a -[UIViewController _presentViewController:withAnimationController:completion:] + 370026 UIKitCore 0x00000001110bddd7 __63-[UIViewController _presentViewController:animated:completion:]_block_invoke + 9827 UIKitCore 0x00000001110be2ef -[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 51128 UIKitCore 0x00000001110bdd3e -[UIViewController _presentViewController:animated:completion:] + 17229 UIKitCore 0x00000001110bdf9c -[UIViewController presentViewController:animated:completion:] + 15030 物联网模拟器 0x000000010b9568a1 $s13IoT_Simulator11AppDelegateC23setupRootViewControlleryyF + 91331 物联网模拟器 0x000000010b9514dc $s13IoT_Simulator11AppDelegateC11application_29didFinishLaunchingWithOptionsSbSo13UIApplicationC_SDySo0k6LaunchJ3KeyaypGSgtFySbcfU_ + 28432 物联网模拟器 0x000000010b9516e3 $s13IoT_Simulator11AppDelegateC11application_29didFinishLaunchingWithOptionsSbSo13UIApplicationC_SDySo0k6LaunchJ3KeyaypGSgtFySbcfU_TA + 1933 物联网模拟器 0x000000010b958eb8 $s13IoT_Simulator12LoginManagerC5login5retry10completionySb_ySbctFySbcfU_ + 29634 物联网模拟器 0x000000010b958f47 $s13IoT_Simulator12LoginManagerC5login5retry10completionySb_ySbctFySbcfU_TA + 2335 物联网模拟器 0x000000010b95a8e9 $s13IoT_Simulator12LoginManagerC20acquireTokenSilently10completionyySbc_tFySo22ADAuthenticationResultCcfU_ + 312936 物联网模拟器 0x000000010b95a955 $s13IoT_Simulator12LoginManagerC20acquireTokenSilently10completionyySbc_tFySo22ADAuthenticationResultCcfU_TA + 2137 物联网模拟器 0x000000010b95ae92 $sSo22ADAuthenticationResultCIegg_ABIeyBy_TR + 6638 ADAL 0x000000010bc9953a __70-[ADAuthenticationRequest(AcquireToken)acquireToken:completionBlock:]_block_invoke + 305039 ADAL 0x000000010bc9a131 __63-[ADAuthenticationRequest(AcquireToken)validatedAcquireToken:]_block_invoke + 11340 ADAL 0x000000010bc9a58f __56-[ADAuthenticationRequest(AcquireToken) getAccessToken:]_block_invoke + 27141 ADAL 0x000000010bc818cf __40-[ADAcquireTokenSilentHandler getToken:]_block_invoke + 79942 ADAL 0x000000010bc84a64 -[ADAcquireTokenSilentHandler getAccessToken:] + 266043 ADAL 0x000000010bc81572 -[ADAcquireTokenSilentHandler getToken:] + 17844 ADAL 0x000000010bc9a424 -[ADAuthenticationRequest(AcquireToken) getAccessToken:] + 48445 ADAL 0x000000010bc9a03b -[ADAuthenticationRequest(AcquireToken)validatedAcquireToken:] + 33146 ADAL 0x000000010bc99964 __70-[ADAuthenticationRequest(AcquireToken)acquireToken:completionBlock:]_block_invoke.162 + 64447 ADAL 0x000000010bca98ab __74-[ADAuthorityValidation checkAuthority:validateAuthority:completionBlock:]_block_invoke + 29948 ADAL 0x000000010bcaa185 __76-[ADAuthorityValidation validateAADAuthority:requestParams:completionBlock:]_block_invoke_2 + 5349 libdispatch.dylib 0x000000011016bd7f _dispatch_call_block_and_release + 1250 libdispatch.dylib 0x000000011016cdb5 _dispatch_client_callout + 851 libdispatch.dylib 0x000000011016f7b9 _dispatch_queue_override_invoke + 102252 libdispatch.dylib 0x000000011017d632_dispatch_root_queue_drain + 35153 libdispatch.dylib 0x000000011017dfca _dispatch_worker_thread2 + 13054 libsystem_pthread.dylib 0x00000001105556b3 _pthread_wqthread + 58355 libsystem_pthread.dylib 0x00000001105553fd start_wqthread + 13)

解决方案

尝试在主线程上调用 setupRootViewController,因为大多数完成处理程序都在后台线程上

LoginManager.shared.login() {(成功)->作废如果成功{print("登录成功")DispatchQueue.main.async{self.setupRootViewController()}} 别的 {print("登录失败")}}

I am showing an initial view controller in my app until login completes. Once login is successful I'm trying to show my Main ViewController using below code in AppDelegate class. It is showing up view controllers properly only but it is showing an error. I might be making some mistake in my code.

I want my Main ViewController viewWillAppear() to be called only after all the work that I'm doing in AppDelegate gets completed.

AppDelegate Class

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        print("Inside App Delegate")

        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.initializeAppViewState()

        LoginManager.shared.login() { (success) -> Void in
            if success {
                print("Login Successful")
                self.setupRootViewController()
            } else {
                print("Login Un-Successful")
            }
        }
        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
    }

    func applicationWillTerminate(_ application: UIApplication) {
    }

    func initializeAppViewState() {
        if (!Thread.isMainThread) {
            DispatchQueue.main.async {
                self.initializeAppViewState()
            }
            return
        }

        self.window!.rootViewController = InitialViewController(nibName: "InitialViewController", bundle: Bundle.main)
        self.window!.makeKeyAndVisible()
    }

    func setupRootViewController() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier :"NavigationController") as! UINavigationController

        if let window = self.window, let rootViewController = window.rootViewController {
            var currentController = rootViewController
            while let presentedController = currentController.presentedViewController {
                currentController = presentedController
            }
            currentController.present(viewController, animated: true, completion: nil)
        }
    }
}

Below is the error I'm getting

Login Successful
2019-10-03 20:49:00.707020+0530 IoT Simulator[47491:1653133] [Animation] +[UIView setAnimationsEnabled:] being called from a background thread. Performing any operation from a background thread on UIView or a subclass is not supported and may result in unexpected and insidious behavior.                                                                                                                              trace=(
    0   UIKitCore                           0x0000000111b7bdda kFixedAnimationDuration_block_invoke_5 + 107
    1   libdispatch.dylib                   0x000000011016cdb5 _dispatch_client_callout + 8
    2   libdispatch.dylib                   0x000000011016e83c _dispatch_once_callout + 66
    3   UIKitCore                           0x0000000111b7bd6d +[UIView(Animation) setAnimationsEnabled:] + 76
    4   UIKitCore                           0x0000000111b7bebb +[UIView(Animation) performWithoutAnimation:] + 84
    5   UIKitCore                           0x0000000110e06d46 -[UIVisualEffectView _updateSubviews] + 325
    6   UIKitCore                           0x0000000110e07b56 -[UIVisualEffectView _configureAllEffects] + 1435
    7   UIKitCore                           0x0000000110e05fe5 -[UIVisualEffectView setBackgroundEffects:] + 396
    8   UIKitCore                           0x0000000110e100ee -[_UIBarBackground updateBackground] + 229
    9   UIKitCore                           0x0000000110e1039d -[_UIBarBackground transitionBackgroundViews] + 208
    10  UIKitCore                           0x0000000110e99bde -[_UINavigationBarVisualProviderModernIOS _updateBackgrounds] + 850
    11  UIKitCore                           0x0000000110e99e20 -[_UINavigationBarVisualProviderModernIOS layoutSubviews] + 272
    12  UIKitCore                           0x0000000110e4ee4c -[UINavigationBar layoutSubviews] + 256
    13  UIKitCore                           0x0000000111b89e69 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1417
    14  UIKitCore                           0x0000000110e4eba4 -[UINavigationBar layoutSublayersOfLayer:] + 248
    15  QuartzCore                          0x000000011310cd22 -[CALayer layoutSublayers] + 173
    16  QuartzCore                          0x00000001131119fc _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 396
    17  UIKitCore                           0x0000000111b74e2d -[UIView(Hierarchy) layoutBelowIfNeeded] + 646
    18  UIKitCore                           0x0000000110ffa271 -[UINavigationController _positionNavigationBarHidden:edge:initialOffset:] + 800
    19  UIKitCore                           0x0000000110ffa4f0 -[UINavigationController _positionNavigationBarHidden:edge:] + 388
    20  UIKitCore                           0x000000011100149d -[UINavigationController loadView] + 239
    21  UIKitCore                           0x00000001110a7d04 -[UIViewController loadViewIfRequired] + 172
    22  UIKitCore                           0x00000001110a8524 -[UIViewController view] + 27
    23  UIKitCore                           0x0000000110fcf5b4 -[_UIFullscreenPresentationController _setPresentedViewController:] + 89
    24  UIKitCore                           0x0000000110fc36aa -[UIPresentationController initWithPresentedViewController:presentingViewController:] + 133
    25  UIKitCore                           0x00000001110bb18a -[UIViewController _presentViewController:withAnimationController:completion:] + 3700
    26  UIKitCore                           0x00000001110bddd7 __63-[UIViewController _presentViewController:animated:completion:]_block_invoke + 98
    27  UIKitCore                           0x00000001110be2ef -[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 511
    28  UIKitCore                           0x00000001110bdd3e -[UIViewController _presentViewController:animated:completion:] + 172
    29  UIKitCore                           0x00000001110bdf9c -[UIViewController presentViewController:animated:completion:] + 150
    30  IoT Simulator                       0x000000010b9568a1 $s13IoT_Simulator11AppDelegateC23setupRootViewControlleryyF + 913
    31  IoT Simulator                       0x000000010b9514dc $s13IoT_Simulator11AppDelegateC11application_29didFinishLaunchingWithOptionsSbSo13UIApplicationC_SDySo0k6LaunchJ3KeyaypGSgtFySbcfU_ + 284
    32  IoT Simulator                       0x000000010b9516e3 $s13IoT_Simulator11AppDelegateC11application_29didFinishLaunchingWithOptionsSbSo13UIApplicationC_SDySo0k6LaunchJ3KeyaypGSgtFySbcfU_TA + 19
    33  IoT Simulator                       0x000000010b958eb8 $s13IoT_Simulator12LoginManagerC5login5retry10completionySb_ySbctFySbcfU_ + 296
    34  IoT Simulator                       0x000000010b958f47 $s13IoT_Simulator12LoginManagerC5login5retry10completionySb_ySbctFySbcfU_TA + 23
    35  IoT Simulator                       0x000000010b95a8e9 $s13IoT_Simulator12LoginManagerC20acquireTokenSilently10completionyySbc_tFySo22ADAuthenticationResultCcfU_ + 3129
    36  IoT Simulator                       0x000000010b95a955 $s13IoT_Simulator12LoginManagerC20acquireTokenSilently10completionyySbc_tFySo22ADAuthenticationResultCcfU_TA + 21
    37  IoT Simulator                       0x000000010b95ae92 $sSo22ADAuthenticationResultCIegg_ABIeyBy_TR + 66
    38  ADAL                                0x000000010bc9953a __70-[ADAuthenticationRequest(AcquireToken) acquireToken:completionBlock:]_block_invoke + 3050
    39  ADAL                                0x000000010bc9a131 __63-[ADAuthenticationRequest(AcquireToken) validatedAcquireToken:]_block_invoke + 113
    40  ADAL                                0x000000010bc9a58f __56-[ADAuthenticationRequest(AcquireToken) getAccessToken:]_block_invoke + 271
    41  ADAL                                0x000000010bc818cf __40-[ADAcquireTokenSilentHandler getToken:]_block_invoke + 799
    42  ADAL                                0x000000010bc84a64 -[ADAcquireTokenSilentHandler getAccessToken:] + 2660
    43  ADAL                                0x000000010bc81572 -[ADAcquireTokenSilentHandler getToken:] + 178
    44  ADAL                                0x000000010bc9a424 -[ADAuthenticationRequest(AcquireToken) getAccessToken:] + 484
    45  ADAL                                0x000000010bc9a03b -[ADAuthenticationRequest(AcquireToken) validatedAcquireToken:] + 331
    46  ADAL                                0x000000010bc99964 __70-[ADAuthenticationRequest(AcquireToken) acquireToken:completionBlock:]_block_invoke.162 + 644
    47  ADAL                                0x000000010bca98ab __74-[ADAuthorityValidation checkAuthority:validateAuthority:completionBlock:]_block_invoke + 299
    48  ADAL                                0x000000010bcaa185 __76-[ADAuthorityValidation validateAADAuthority:requestParams:completionBlock:]_block_invoke_2 + 53
    49  libdispatch.dylib                   0x000000011016bd7f _dispatch_call_block_and_release + 12
    50  libdispatch.dylib                   0x000000011016cdb5 _dispatch_client_callout + 8
    51  libdispatch.dylib                   0x000000011016f7b9 _dispatch_queue_override_invoke + 1022
    52  libdispatch.dylib                   0x000000011017d632 _dispatch_root_queue_drain + 351
    53  libdispatch.dylib                   0x000000011017dfca _dispatch_worker_thread2 + 130
    54  libsystem_pthread.dylib             0x00000001105556b3 _pthread_wqthread + 583
    55  libsystem_pthread.dylib             0x00000001105553fd start_wqthread + 13
)

解决方案

Try calling setupRootViewController on main thread because most completion handlers are on background Threads

LoginManager.shared.login() { (success) -> Void in
        if success {
            print("Login Successful")
    DispatchQueue.main.async{ 
        self.setupRootViewController()
       }
    } else {
            print("Login Un-Successful")
        }
    }

这篇关于从后台线程调用动画 +UIView setAnimationsEnabled 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆