iOS:NSUserDefault在AppDelegate中加载速度不够快?有条件的间歇性失败

时间:2016-09-25 17:54:15

标签: ios swift nsuserdefaults appdelegate

我在AppDelegate中使用NSUserDefault来决定在加载我的应用后首先向用户显示哪个VC。

如果用户未设置特定设置,则会转到VC 1,然后设置该设置。

如果用户有设置,则会转到VC 2然后再打开。

我的问题是,当我知道我有设置时,有时候我会被发送到VC1。

这让我相信在我的条件检查值之前NSUserDefaults没有完全加载。

这可能是可能的吗?如果有的话,是否有办法“阻止”加载过程,直​​到变量完全加载?

以下是我正在使用的AppDelegate的相关代码:

class AppDelegate: UIResponder, UIApplicationDelegate {

let prefs = NSUserDefaults.standardUserDefaults()
var window: UIWindow?

func updateNavBar(navBar: UINavigationBar) {
    navBar.barTintColor = UIColor(netHex:0x1d8696)
    navBar.tintColor = UIColor(netHex:0xAEFFDD)
    navBar.titleTextAttributes = [NSForegroundColorAttributeName : UIColor(netHex:0xAEFFDD),NSFontAttributeName : UIFont(name: "Lato-Bold", size: 16)!]

}

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    FIRApp.configure()
    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

    self.updateNavBar(UINavigationBar.appearance())



    if let team = self.prefs.stringForKey("team")
    {
        print("Team prefs found. (" + team + ") User sent to IVList")

        // show IVList VC

        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) // this assumes your storyboard is titled "Main.storyboard"
        let yourVC = mainStoryboard.instantiateViewControllerWithIdentifier("TabBarController") as! UITabBarController // inside "YOUR_VC_IDENTIFIER" substitute the Storyboard ID you created in step 2 for the view controller you want to open here. And substitute YourViewController with the name of your view controller, like, for example, ViewController2.
        appDelegate.window?.rootViewController = yourVC
        appDelegate.window?.makeKeyAndVisible()





        }else{

        // show editProfile VC
        print("No team prefs found. User sent to profile Edit")
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) // this assumes your storyboard is titled "Main.storyboard"
        let yourVC = mainStoryboard.instantiateViewControllerWithIdentifier("editProfile") as! EditProfileViewController // inside "YOUR_VC_IDENTIFIER" substitute the Storyboard ID you created in step 2 for the view controller you want to open here. And substitute YourViewController with the name of your view controller, like, for example, ViewController2.
        appDelegate.window?.rootViewController = yourVC
        appDelegate.window?.makeKeyAndVisible()

        }




    return true
}

我认为这是一个负载计时的事情,因为问题是间歇性和不一致的。它发生在大约20%的时间。

1 个答案:

答案 0 :(得分:0)

我最近确实遇到过这个问题。

简单的答案是appDelegate中的didFinishLaunchingWithOptions()仅在为初始视图控制器加载了nib之后才被调用。

请参阅iOS - viewDidLoad is being called BEFORE the didFinishLaunchingWithOptions delegate?

上的讨论

希望有所帮助!