[英]Image not show in table view cell
我正在嘗試將Unsplash API 中的圖像下載到表格視圖中,但由於某種原因,它沒有顯示在表格視圖單元格中。 根據文檔,下載圖像應該是這樣的 “photo.urls.raw” 下面是下載圖像的邏輯。 我該如何解決這個問題?
鏈接: https://github.com/lexypaul13/Photo-Finder
**Data Model:**
struct Photos: Codable {
var id: String?
var createdAt: String?
var updatedAt: String?
var promotedAt: String?
var width: Int?
var height: Int?
var color: String?
var blurHash: String?
var photoDescription: String?
var altDescription: String?
var urls: Urls?
var likes: Int?
var likedByUser: Bool?
var user: User?
}
// MARK: - User
struct User:Codable {
var id: String?
var updatedAt: String?
var username: String?
var name: String?
var firstName: String?
var lastName: String?
var twitterUsername: String?
var portfolioURL: String?
var bio: String?
var location: String?
var instagramUsername: String?
var totalCollections: Int?
var totalLikes: Int?
var totalPhotos: Int?
var acceptedTos: Bool?
enum CodingKeys: String, CodingKey {
case id = "id"
case updatedAt = "updated_at"
case username = "username"
case name = "name"
case firstName = "first_name"
case lastName = "last_name"
case twitterUsername = "twitter_username"
case portfolioURL = "portfolio_url"
case bio = "bio"
case location = "location"
case instagramUsername = "instagram_username"
case totalCollections = "total_collections"
case totalLikes = "total_likes"
case totalPhotos = "total_photos"
case acceptedTos = "accepted_tos"
}
}
// MARK: - Urls
struct Urls: Codable {
var raw: String?
var full: String?
var regular: String?
var small: String?
var thumb: String?
enum CodingKeys: String, CodingKey {
case raw = "raw"
case full = "full"
case regular = "regular"
case small = "small"
case thumb = "thumb"
}
}
typealias Photo = [Photos]
**Network Call:**
func downloadImage(from urlString: String, completed: @escaping (UIImage?) -> Void) {
let cacheKey = NSString(string: urlString) //creates cacheKey to store in image variable
let imagesBaseURLSTring = imageURL.urls?.thumb ?? "No image"
guard let url = URL(string: imagesBaseURLSTring) else {
completed(nil)
return
}
if let image = cache.object(forKey: cacheKey) { //check if image is there
completed(image)
return
}
let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
guard let self = self,
error == nil,
let response = response as? HTTPURLResponse, response.statusCode == 200,
let data = data,
let image = UIImage(data: data) else {
completed(nil)
return
}
self.cache.setObject(image, forKey: cacheKey)
completed(image)
}
task.resume()
}
Update UI:
func setTableCell(_ photos:Photos){
updateUI(userName: photos.user?.username, fullName:photos.user?.name, date: photos.createdAt, photo: photos.urls?.thumb)
}
private func updateUI(userName:String?,fullName:String?,date:String?,photo:String?){
self.userName.text = userName
self.fullName.text = fullName
self.date.text = date
downloadImage(photo ?? "")
}
func downloadImage(_ url:String) {
NetworkManger.shared.downloadImage(from:url){ [weak self] image in
guard let self = self else { return }
DispatchQueue.main.async {
self.photoImage.image = image
}
}
}
如果您嘗試放置調試點並檢查流程,您會發現以下代碼和平存在問題:
let cacheKey = NSString(string: urlString) //creates cacheKey to store in image variable
let imagesBaseURLSTring = imageURL.urls?.thumb ?? "No image"
// Here imagesBaseURLSTring is nil, so image is not downloaded and it is completed with nil. imagesBaseURLSTring is nil because of imageURL.urls is nil
guard let url = URL(string: imagesBaseURLSTring) else {
completed(nil)
return
}
這里的imagesBaseURLSTring為nil,所以不下載圖片,用nil補全。 imagesBaseURLSTring 為 nil,因為 imageURL.urls 為 nil。 請檢查您的邏輯,為什么它是零。
只是為了測試您的下載部分,您可以檢查以下內容:
//let imagesBaseURLSTring = imageURL.urls?.thumb ?? "No image"
let imagesBaseURLSTring = urlString
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.