Swift - ViewDidLoad后至少10秒加载本地图像

时间:2015-02-03 21:43:29

标签: ios xcode swift

自从我开始学习IOS开发以来已经过去了2个月。我正在创建一个首先需要登录视图的应用程序。所以,

  1. 我使用HTTP get方法 - 异步 - 来检查登录信息并获得Json响应。
  2. 我开始理解使用委托/协议方式。我想我正在做一切关于授权的事情。
  3. 在我的LoginViewController(1st)中,我检查来自GET请求的返回数据。我的数据到了。 4.当一切正确时,我将userdata保存到UserDefaults并执行segue。
  4. 所以我的问题是;  加载SecondViewController时,视图中应该看到的每个元素都在那里,除了愚蠢的图像(完全静态,没有以编程方式添加或编辑)。它们在视图加载完成后加载10或20秒。查询肯定已经完成,因为第二个VC在加载时会正确显示数据。

    我注意到当我仅异步获取数据时会出现此问题。

    我尝试了同步get方法。视图出现后立即加载图像。

    我错过了什么?谢谢你的任何想法。

    这是我的代码:

    class LoginViewController: UIViewController, UITextFieldDelegate, ConnectionDelegate {
    
    var connectionModel:ConnectionModel = ConnectionModel()
    var userDefaults:UserDefaults = UserDefaults()
    
    @IBOutlet weak var codeField: UITextField!
    @IBOutlet weak var usernameField: UITextField!
    @IBOutlet weak var passwordField: UITextField!
    @IBOutlet weak var failedLabel: UILabel!
    @IBOutlet weak var rememberSwitch: UISwitch!
    @IBOutlet weak var loading: UIActivityIndicatorView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.connectionModel.delegate = self
    
        if(self.userDefaults.remember()){
            self.loading.startAnimating()
            self.connectionModel.fetchBasicData()
        }
    }
    
    func resultCame(value: Int) {
        self.loading.stopAnimating()
    
        switch value {
        case 1:
            loginToMain()
        case 2:
            noStudent()
        case 3:
            serverFailed()
        case 0:
            connectionFailed()
        default:
            connectionFailed()
        }
    
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func loginButtonTapped(sender: UIButton) {
        self.loading.startAnimating()
        self.connectionModel.checkLogin(usernameField.text, password: passwordField.text, code:codeField.text)
    }
    
    func loginToMain(){
        if(self.rememberSwitch.on){
            self.userDefaults.rememberUser()
        }
        self.performSegueWithIdentifier("loginToMain", sender: self)
    }
    
    func noStudent(){
        self.failedLabel.text = "Giriş bilgileri bulunamadı."
    }
    
    func serverFailed(){
        let alertController = UIAlertController(title: "Sunucu Hatası", message: "Hata Kodu: 0x03", preferredStyle: .Alert)
    
        let OKAction = UIAlertAction(title: "Kapat", style: .Default) { (action) in
            self.connectionModel.checkConn(self)
        }
        alertController.addAction(OKAction)
    
        self.presentViewController(alertController, animated: false, completion:nil)
    }
    
    func connectionFailed(){
        let alertController = UIAlertController(title: "Bağlantı Hatası", message: "Hata Kodu: 0x00", preferredStyle: .Alert)
    
        let OKAction = UIAlertAction(title: "Kapat", style: .Default) { (action) in
            self.connectionModel.checkConn(self)
        }
        alertController.addAction(OKAction)
    
        self.presentViewController(alertController, animated: falfalse, completion:nil)
    }
    

    修改 好吧,我想在尝试了600亿个不同的测试场景后,我现在想出来了。图像没有加载到第二个VC中;因为即使在我的数据从第一个VC中的异步请求到达并且因此执行了segue之后,该请求也没有在后台结束另外20秒。一旦请求完成(谁知道为什么)图像加载。

    为什么即使在运行完成处理程序之后请求仍保持活动状态和连接状态?我没有任何意义!??

    解决: 没有人告诉我在完成处理程序中使用这个f.ing函数。显然,这就是图像加载这种情况的原因。 GRRRR ...

    dispatch_async(dispatch_get_main_queue()) {
        self.loading.stopAnimating()
        self.label.text = "string coming from data"
    }
    

1 个答案:

答案 0 :(得分:0)

如果正在下载图像,那么当异步下载图像时,UI的其余部分将加载,图像将仅在下载完成后加载(因此时间取决于您的连接速度)。

但是,如果您的图像是同步下载的,那么应用会等到下载它们以刷新用户界面,这就是所有内容同时出现的原因。