2016-10-04 18 views
5

私はコードをSwift 3にアップデートしましたが、Alamofire 4.0への移行に問題があります。私はAlamofire移行ガイドを使用して、必要な変更のほとんどを成功させましたが、イメージ・データの取得にはまだ問題があります。 (意図したとおりに働いていた)Alamofireリクエストで画像データを取得

古いスウィフト2/Alamofire 3コード:Alamofire 4 へのアップデートで

func beginGetImageRequest() { 
    if let imagePath = thumbPath { 
     request = Alamofire.request(.GET, imagePath).response(completionHandler: { (_, _, imageData, error) -> Void in 
      if error != nil { 
       NSLog("Error downloading thumbnail image: \(error)") 
      } else { 
       if let downloadedImage = UIImage(data: imageData!) { 
        self.imageView.image = downloadedImage 
       } 
      } 
     }) 
    } 
} 

私の試み:

func beginGetImageRequest() { 
    if let imagePath = thumbPath { 
     request = Alamofire.request(imagePath, method: .get, parameters: [:], encoding: JSONEncoding.default) 
      .validate { request, response, imageData in 
       if let downloadedImage = UIImage(data: imageData!) { 
        self.imageView.image = downloadedImage 
       } else { 
        print(response) 
        print(imageData) 
       } 
       return .success 
      } 
    } 
} 

print(imageData)出力Optional(306 bytes)。画像は約40 kbでなければなりません。問題は、どのようにUIImageにデータを変換しているのかではなく、要求をどのように実装しているのかということです。あなたが本当にイメージをダウンロードするためAlamofireを使用したい場合はここで

print(response)

<NSHTTPURLResponse: 0x618000221660> { URL: http://209.126.98.238/cache/igames_thumb/images/games/53848027743af.jpeg } { status code: 400, headers { 
    Connection = close; 
    "Content-Encoding" = gzip; 
    "Content-Length" = 245; 
    2016-10-04 21:54:53.653480 EyeGames[74216:3416747] [] nw_connection_send_stats_report 21 Generated report: 
    Delegated:         0 
    Report reason:        app data stall 
    TCP statistics report:      
    Time to DNS start:      0 ms 
    Time to DNS resolved:     0 ms 
    DNS resolved time:      0 ms 
    DNS answers cached:      0 
    Interface type:       1 
    Time to TCP start:      3 ms 
    Time to TCP establishment:    223 ms 
    Connection establishment:    220 ms 
    Flow duration:       11447 ms 
    Connected interface type:    1 
    Connected:        1 
    Traffic class:       0 
    Cellular fallback:      0 
    Cellular RRC connected:     0 
    Kernel reported stalls:     0 
    Kernel reported connection stalls:  0 
    Kernel reported read stalls:    0 
    Kernel reported write stalls: 
"Content-Type" = "text/html; charset=iso-8859-1"; 
    Date = "Tue, 04 Oct 2016 18:54:43 GMT"; 
    Server = "Apache/2.2.22 (Debian)"; 
    Vary = "Accept-Encoding"; 
} } 
+0

そして、何の応答が含まれているを呼び出す前に、URLのキャッシュを削除することができますか?あなたはそこから始める必要があります – Godfather

+0

@Godfather応答からの出力を含めるために私の質問を編集 –

+0

あなたは400エラーコードを取得しています。あなたのリクエストは不正です。エンコードをURLに変更してみてください – Godfather

答えて

14

人々の上には、AlamofireImageは画像コンポーネントライブラリを作りました。それはあなたの人生をより簡単にするためのすべてのものを処理します。それをあなたのプロジェクトに追加してください。

import Alamofire 
import AlamofireImage 

Alamofire.request(imageUrl, method: .get).responseImage { response in 
    guard let image = response.result.value else { 
     // Handle error 
     return 
    } 
    // Do stuff with your image 
} 
+0

これは完璧です!このコンポーネントライブラリについて知りませんでした。ありがとうございました! –

+1

上記のコードを実行するには、AlamofireImageを使用するためにAlamofireとAlamofireImageをプロジェクトに追加する必要がありますか、AlamofireImageを単独で追加するだけです。 –

2

出力され、あなたはゴッドファーザーは、上記のコメントで示唆したのと同様に、JSONEncodingの代わりにURLエンコード試してみてください。 代わりにKingfisherの使用をお勧めします。それはAlamofireであなたの一行のコードの代わりに、GETリクエストメソッドがかかります。Alamofireで

self.imageView.kf.setImage(with: URL(string: imagePath)) 
+0

私のプロジェクトはイメージやイメージ以外の問題のためにAlamofireに依存しているので、Alamofireを使うことをお勧めします。しかし、将来のプロジェクトではKingfisherを念頭に置いていきます。あなたのご意見ありがとうございます! –

0

以前に保存したイメージを取得すると、イメージキャッシュに問題が生じることがあります。これを防止するために

、あなたはAlamofire.request

let urlRequest = URLRequest(url: URL(string: url)!) 
URLCache.shared.removeCachedResponse(for: urlRequest) 
関連する問題