如何在应用加载之前完成异步调用?

时间:2016-09-03 02:14:45

标签: swift

我找不到这个答案可能是因为我几个星期前开始编程以来我不太确定我在寻找什么。

我的故事板入口点需要从异步会话和JSON解析中获取的数据。然后,一旦获取数据,它就会将其存储到NSUserDefaults,因此它不必再次进行异步调用,应用程序可以随时访问该数据。

我将我的异步调用放在storyboard入口点的viewdidload中,因为据我所知,应用程序的起始位置。问题是,在应用程序第二次启动之前,数据才会显示。

我从异步调用中获取的数据每月只更改一次,因此它不一定是时间敏感的。

如何延迟应用程序进入故事板入口点,直到异步调用完成?

这是否是正确的方法呢?

我应该切换到同步通话吗?

如果我将故事板入口点更改为看起来像应用程序正在加载的视图控制器,然后当异步调用完成时,使用完成处理程序对需要异步调用完成的视图控制器执行segue会怎样? / p>

1 个答案:

答案 0 :(得分:1)

感谢Leo的工作。

Storing a variable when the app is first installed

我在这做了两件事。首先,我创建了一个新的视图控制器,它将执行异步调用并在完成时切换到我的主视图控制器。然后我通过使用上面链接的解决方案检测到它是否是第一次启动。这两个人一起工作。

import Foundation
import UIKit

class FirstLoad: UIViewController {

var installedDate: NSDate? {
    get {
        return NSUserDefaults().objectForKey("installedDateKey") as? NSDate
    }
    set {
        NSUserDefaults().setObject(newValue, forKey: "installedDateKey")
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewDidAppear(animated: Bool) {
    firstLoad()
}

func firstLoad() {
    if installedDate == nil {
        installedDate = NSDate()

        parseData(heroesDataProject) { heroesArrayFromParse in             //this function gets my json and the following code is executed after completion

            saveToDefaults("heroesOriginal")
            print("First Run")
            self.performSegueWithIdentifier("firstLoadToHomeMenu", sender: nil)
        }

    } else {
        print("Not first run, installd on \(installedDate!)")
        loadFromDefaults(userProfile)
        performSegueWithIdentifier("firstLoadToHomeMenu", sender: nil)

    }
}
}