简体   繁体   中英

error while loading images asynchronously from firebase

I have been trying to load images asynchronously for quiet a while now. When i make a new class for this and built and run the app an error appears in the runtime log

// log
Failed to set (borderWidth) user defined inspected property on ...
could not set nil as the value for the key borderWidth.
could not set nil as the value for the key cornerRadius.

It is fine with extension instead of class, the images load async but, this way I will not be able to make sure the correct image is loaded in the image view.

//  cell for item at
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell  = collectionView.dequeueReusableCell(withReuseIdentifier: "subscribeCell", for: indexPath) as! subscribeViewCell

    cell.userID = self.users[indexPath.row].userId
    cell.profileName.text = self.users[indexPath.row].fullName
    cell.profileImage.setupWithImageUrl(imageUrl: self.users[indexPath.row].ImagePath)
    checkFollowers(indexPath : indexPath)
    return cell
}

the class i have been working with in the same view controller :

Class to download image:

private var imageCache = [String:UIImage]()

class CustomImageView : UIImageView {

    var lastImageUrl : String?

    func setupWithImageUrl (imageUrl: String) {

        self.contentMode = .scaleAspectFill
        self.clipsToBounds = true
        self.layer.cornerRadius = 14
        self.layer.borderWidth = 0

        lastImageUrl = imageUrl
        if let cachedImage = imageCache[imageUrl] {
            self.image = cachedImage
            return
        }
        guard let url = URL(string: imageUrl) else {
            return
        }
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let error = error {
                print(error)
                return
            }
            guard let data = data else {
                return
            }
            guard let image = UIImage(data : data) else {
                return
                }
            imageCache[url.absoluteString] = image
            }
            if (url.absoluteString != self.lastImageUrl) {
            return
            }
            DispatchQueue.main.async {
                self.image = self.image
            }
        }
    }

Why "this way" cannot make sure correct image is loaded in the image view. I read your code I think your code is fine for collectionViewController cellForItemAt

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM