0

我正在使用 SDWebImage 从 url 获取图像并将其分配给这样的数组...

let imgUrl = arrProduct?[indexPath.section].images[indexPath.row].url
let placeholderImage = UIImage(named: "appLogo.jpg")

cell.prdImgView.sd_setImage(with:imgUrl, 
                placeholderImage:placeholderImage,
                         options: []) { (image, error, imageCacheType, imageUrl) in
    arrayOfSelectedImages.append(image!)
}

现在我只是不想添加到这样的数组中。相反,在将图像添加到之后,arrayOfSelectedImages我想更新这个数组值didSet并清空arrayOfSelectedImages数组,以便每次数组获得一个新值时,它都会更新该值,didSet并且 & arrayOfSelectedImages 被清空。所以最后我在 didSet 中的数组将拥有我需要的所有图像,我可以将这些图像传递给其他视图......我怎样才能实现这一点......?

4

2 回答 2

1

不完全确定这是否是您想要的,但didSet如果您修改数组,而不只是分配数组,则会触发作为数组的属性。这是一个例子:

struct A 
{
    var anArray = [1, 2, 3]
    {
        didSet 
        {
            print("Hi, there!")
            anArray.remove(at: 0)
        }
    }
}

var a = A()

a.anArray.append(4)

// Prints Hi there!

print(a.anArray)

// prints [2, 3, 4]
于 2017-11-03T10:50:52.450 回答
0

这项任务很容易完成。您需要一个有效的标准来比较附加的对象,重要的是,您在将对象附加到数组之前应用的标准,而不是之后。用于验证附加对象并在不合适时将didSet其删除,是不好的设计

如果您的UIImage对象未封装在任何其他对象或结构中以唯一标识这些对象,并且您无法选择是否应该下载特定图像(这是最佳和最合适的做法),您可以比较UIImage通过比较底层图像数据来识别两个对象。这以前可以通过获取图像的 PNG 表示并比较该数据来完成,但现在有一个很好的简单方法。

比较图像

isEqual( :) 方法是确定两个图像是否包含相同图像数据的唯一可靠方法。您创建的图像对象可能彼此不同,即使您使用相同的缓存图像数据对其进行初始化也是如此。确定它们是否相等的唯一方法是使用 isEqual( :) 方法,该方法比较实际的图像数据。清单 1 说明了比较图像的正确和错误方法。

https://developer.apple.com/documentation/uikit/uiimage

用法

if !arrayOfSelectedImages.contains(where: { $0.isEqual(image) }) {
    arrayOfSelectedImages.append(image)
}
于 2017-11-03T11:59:14.527 回答