2017-08-27 13 views
0

Alamofireフレームワークを使用して、読み取りサーバーjsonファイルを作成し、ダウンロードします。私は、JSONの最終更新日を確認して、ユーザーにjsonのコンテンツをダウンロードさせたいと思っています。しかし、関数getLastModifiedDateは常にnilを返します。ここにサンプルコードを記載します。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

私はスウィフト3の初心者やネットワークprogamming午前、私はこの問題を解決する方法は考えてグーグルないとスウィフト文書を見ました。誰でも助けてもらえますか?どうもありがとうございました。

+0

を試してみてくださいクロージャを使用する必要がありますなぜgetLastModifiedDate戻りはnilクロージャを使用していませんクロージャの戻り値の型はvoidです。クロージャから戻ってくることはできません、代わりに完了ハンドラを使用してください。 –

答えて

2

あなたはそれが"Last-Modified"値を返していないので。あなたは、あなたがこの

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

警告表示を促し、ユーザーが[OK]をクリックしたいので、ダウンロードjson(callDowload)関数を呼び出します。私はcallDownloadも戻り値を持つことを計画しています、それはcallDownload()でもクロージャを使用していますか?非同期モードを使用してサーバーの戻り値を待機させてから、次の手順を実行できませんか?私の考えは間違っていますか? –

+0

を参照してください。ダウンロードはサーバーコールを実行しているため、待機する必要があります。したがって、応答を待つために完了ハンドラを使用する必要があります。したがって、サーバーコールを実行する場合は、クロージャを使用する必要があります。あなたは持っていますか? –

0

のような非同期タスクを実行している場合、このコード

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 
} 
関連する問題