2016-10-04 20 views
5

Tôi đã cập nhật mã của mình lên Swift 3 và đang gặp sự cố khi di chuyển sang Alamofire 4.0. Tôi đã sử dụng hướng dẫn di chuyển Alamofire để thực hiện thành công hầu hết các sửa đổi cần thiết, nhưng vẫn gặp sự cố khi nhận dữ liệu hình ảnh.Nhận dữ liệu hình ảnh với yêu cầu Alamofire

Các cũ Swift 2/Alamofire 3 mã (làm việc như dự định):

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 
       } 
      } 
     }) 
    } 
} 

nỗ lực của tôi tại cập nhật lên Alamofire 4:

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) đầu ra Optional(306 bytes). Hình ảnh nên có kích thước khoảng 40 kb, cho tôi biết vấn đề là với cách tôi đang thực hiện yêu cầu, không phải với cách tôi chuyển đổi dữ liệu sang UIImage.

Đây là kết quả cho 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

Và những gì phản ứng chứa? bạn nên bắt đầu ở đó – Godfather

+0

@Godfather Đã chỉnh sửa câu hỏi của tôi để bao gồm đầu ra từ phản hồi –

+0

Bạn đang nhận được 400 mã lỗi. Yêu cầu của bạn không đúng định dạng. Hãy thử thay đổi mã hóa thành URL – Godfather

Trả lời

14

The folks qua tại Alamofire làm một thư viện thành phần hình ảnh, AlamofireImage. Nó xử lý tất cả những thứ này cho bạn để làm cho cuộc sống của bạn dễ dàng hơn. Thêm nó vào dự án của bạn và sau đó bạn chỉ có thể làm điều này:

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

Điều này thật hoàn hảo! Không biết về thư viện thành phần này. Cảm ơn bạn! –

+1

Tôi có cần thêm Alamofire và AlamofireImage vào dự án của tôi để sử dụng AlamofireImage hay chỉ thêm AlamofireImage một mình sẽ hoạt động, để chạy mã trên. –

2

Nếu bạn thực sự muốn sử dụng Alamofire để tải về một hình ảnh, bạn nên cố gắng URLEncoding thay vì JSONEncoding, cũng giống như Bố già gợi ý trong các ý kiến ​​trên. Mặc dù tôi khuyên bạn nên sử dụng Kingfisher để thay thế. Nó sẽ đưa bạn một dòng mã thay vì một phương thức yêu cầu GET với Alamofire:

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

Vì dự án của tôi đã rất phụ thuộc vào Alamofire cho cả vấn đề về hình ảnh và không phải hình ảnh, tôi thích gắn bó với Alamofire hơn. Nhưng tôi sẽ giữ Kingfisher trong tâm trí cho các dự án trong tương lai. Cảm ơn về thông tin bạn vừa nhập! –

0

Bạn có thể gặp vấn đề về bộ nhớ cache hình ảnh nơi bạn lưu hình ảnh trước đó.

Để tránh điều này, bạn có thể xóa bộ nhớ cache cho url trước khi gọi Alamofire.request

let urlRequest = URLRequest(url: URL(string: url)!) 
URLCache.shared.removeCachedResponse(for: urlRequest) 
Các vấn đề liên quan