2017-08-27 1 views
0

J'utilise le framework Alamofire pour faire le fichier json du serveur de lecture et le télécharger. Je veux vérifier la date de dernière modification de JSON et laisser l'utilisateur décider de télécharger le contenu de JSON. Mais la fonction getLastModifiedDate retourne toujours nil. Je liste l'exemple de code ici.Comment retourner le résultat de réponse à la fonction avec Alamofire Swift 3

import Foundation 
import UIKit 
import Alamofire 

class ViewController: UIViewController { 

    @IBOutlet var lastModifedDateLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     if (getLastModifiedDate() != nil) { 
      let alertController = UIAlertController(title: "Information", message: "Download or NOT", preferredStyle: UIAlertControllerStyle.alert) 
      alertController.addAction(UIAlertAction(title: "NO", style: .cancel, handler: nil)) 
      alertController.addAction(UIAlertAction(title: "YES", style: .default, handler: {action in 
       self.callDownload() 
      })) 
      self.present(alertController, animated: true, completion: nil) 
     } 
    } 

    func getLastModifiedDate() -> String? { 

     var date:String? 

     Alamofire.request("http://www.example.com/apps/demopad/manifest.json") 
      .response { serverResponse in 
       date = serverResponse.response?.allHeaderFields["Last-Modified"] as? String 
       print(date ?? "Server date is nil") 
       self.lastModifedDateLabel.text = date 
     } 
     return date 
    } 

    func callDownload() { 

     print("Call Download func") 

     Alamofire.request("http://www.example.com/apps/demopad/manifest.json") 
      .responseJSON { serverRespone in 
       let jsonDict = serverRespone.result.value as? Dictionary<String, Any> 
       print(jsonDict ?? "JSON data is nil") 
     } 
    } 

} 

Running result

Je suis débutant de Swift 3 et Progamming réseau, je google et ai vu le document Swift aucune idée de la façon de résoudre ce problème. Quelqu'un peut-il aider? Merci beaucoup.

+0

les fermetures ont un type de retour nul. Vous ne pouvez pas revenir de la fermeture, utilisez plutôt le gestionnaire d'achèvement. –

Répondre

2

Vous n'utilisez pas la fermeture qui est pourquoi getLastModifiedDate renvoie nil parce qu'il ne revient pas valeur "Last-Modified" .Vous devez utiliser des fermetures si vous faites tâche async comme celui-ci

func getLastModifiedDate(completion: @escaping (String) ->()) { 

    var date:String? 

    Alamofire.request("http://www.example.com/apps/demopad/manifest.json") 
     .response { serverResponse in 
      date = serverResponse.response?.allHeaderFields["Last-Modified"] as? String 
      print(date ?? "Server date is nil") 
      self.lastModifedDateLabel.text = date 
      completion(date) 

    } 

} 
+0

Étant donné que je souhaite activer l'affichage des alertes et que l'utilisateur clique sur OK, j'appelle une fonction de téléchargement json (callDowload). Je prévois que l'appelTélécharger aura aussi des valeurs de retour, est-ce qu'il utilise la fermeture dans callDownload() aussi? Puis-je ne pas utiliser le mode async pour attendre le retour du serveur, puis faire l'étape suivante? Mon concept est-il faux? –

+0

Voir, appel de téléchargement effectue un appel de serveur, par conséquent, vous devez l'attendre et donc vous devez utiliser le gestionnaire d'achèvement pour attendre la réponse. Donc, si vous effectuez des appels de serveur, vous devez utiliser des fermetures. J'espère que tu as? –

0

essayer ce code

func getLastModifiedDate() -> String? { 

    var date:String? 

    Alamofire.request("http://www.example.com/apps/demopad/manifest.json") 
     .response { 
      switch response.result { 
      case .success(let JSON): 
       print("Success with JSON: \(JSON)") 
       print("Request failed with error: \(response.response?.statusCode)") 

       if let response = JSON as? NSMutableDictionary 
       { 

        date = response?.object(forKey: "Last-Modified") as! String 

        print(date ?? "Server date is nil") 
        self.lastModifedDateLabel.text = date 
       } 
       else if let response = JSON as? NSDictionary 
       { 

        date = response?.object(forKey: "Last-Modified") as! String 

        print(date ?? "Server date is nil") 
        self.lastModifedDateLabel.text = date 
       } 
       else if JSON is NSArray 
       { 

       } 

       break 

      case .failure(let error): 
       print("Request failed with error: \(error)") 
       callback(response.result.value as? NSMutableDictionary,error as NSError?) 
       break 
      } 


     } 
     .responseString { response in 

      print("Response String: \(response.result.value)") 
    } 
} 
return date 
}