设置didSet时出现问题

时间:2017-11-03 10:16:55

标签: ios swift sdwebimage didset

我使用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中的数组将拥有我需要的所有图像,我可以将这些图像传递给其他视图......我怎样才能实现这个...?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

完成任务非常简单。您需要一个有效的条件来比较附加的对象,以及在将数据追加之前应用于的标准,而不是之后。使用didSet验证附加对象并在不合适时将其删除,设计不良

如果您的UIImage个对象未被封装在任何其他对象或结构中以唯一地标识这些对象,并且您没有选择是否应该下载特定图像(这是您可以通过比较基础图像数据来比较两个UIImage对象。这可以通过获得图像的PNG表示并比较该数据来实现,但现在有一个很好的简单方法。

  

比较图片

     

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

     

<强> <子> https://developer.apple.com/documentation/uikit/uiimage

<强>用法

if !arrayOfSelectedImages.contains(where: { $0.isEqual(image) }) {
    arrayOfSelectedImages.append(image)
}