【发布时间】:2017-01-01 23:53:48
【问题描述】:
我正在考虑比较 2 个数据数组,每个数组都是由一个结构构建的。这背后的潜在想法是将来自本地数据的数组与来自网络数据的数组进行比较,如果它们相同,则使用本地数据来尝试节省时间,尤其是当某些数据是图像时。
我为测试而模拟的基本代码如下,但是我似乎无法比较数组,因为它们来自结构?有没有办法解决这个问题?
func compareQuery() {
struct packStructNW {
var packName : String
var packDescription : String
var packTitle : String
var packImage : PFFile
var packID: String
}
var packArrayNW = [packStructNW]()
struct packStructLDS {
var packName : String
var packDescription : String
var packTitle : String
var packImage : PFFile
var packID: String
}
var packArrayLDS = [packStructLDS]()
if self.connected {
let packQueryNW = PFQuery(className: "Pack")
packQueryNW.order(byAscending: "packName")
packQueryNW.findObjectsInBackground(block: { (objectsArray, error) in
if error != nil {
print(error!)
} else {
if let packs = objectsArray {
for object in packs {
let arrayName = object.object(forKey: "packName") as! String
let arrayDescription = object.object(forKey: "packDescription") as! String
let arrayTitle = object.object(forKey: "packTitle") as! String
let arrayImage = object.object(forKey: "packImage") as! PFFile
let arrayID = object.objectId as String!
packArrayNW.append(packStructNW(packName: arrayName, packDescription: arrayDescription, packTitle: arrayTitle, packImage: arrayImage, packID: arrayID!))
}
}
}
})
let packQueryLDS = PFQuery(className: "Pack")
packQueryLDS.order(byAscending: "packName")
packQueryLDS.fromLocalDatastore()
packQueryLDS.findObjectsInBackground(block: { (objectsArray, error) in
if error != nil {
print(error!)
} else {
if let packs = objectsArray {
for object in packs {
let arrayName = object.object(forKey: "packName") as! String
let arrayDescription = object.object(forKey: "packDescription") as! String
let arrayTitle = object.object(forKey: "packTitle") as! String
let arrayImage = object.object(forKey: "packImage") as! PFFile
let arrayID = object.objectId as String!
packArrayLDS.append(packStructLDS(packName: arrayName, packDescription: arrayDescription, packTitle: arrayTitle, packImage: arrayImage, packID: arrayID!))
}
}
}
})
print(packArrayNW)
print(packArrayLDS)
if packArrayLDS == packArrayNW {
print("they are the same")
} else {
print("they are different")
}
}
}
----------------- 编辑 --------------------
感谢 WERReo 的解决方案。
最后,我不得不将可等式部分移动到结构的扩展中以使其工作。我确定您展示的方式确实有效,但我无法做到没有错误。
它比较数组,我现在唯一的问题是,当我在后台获取数据时,当我运行比较代码时,数组并没有完全填充。知道如何在运行代码进行比较之前等待填充数组吗?
在主类中
struct myStruct {
var packName : String
var packDescription : String
var packTitle : String
var packImage : PFFile
var packID: String
}
主课外
extension PackViewController.myStruct: Equatable {}
func ==(lhs: PackViewController.myStruct, rhs: PackViewController.myStruct) -> Bool {
let areEqual = lhs.packName == rhs.packName &&
lhs.packDescription == rhs.packDescription &&
lhs.packTitle == rhs.packTitle &&
lhs.packImage === rhs.packImage &&
lhs.packID == rhs.packID
return areEqual
}
【问题讨论】:
-
那段代码还能编译吗?如果是这样,我觉得我们缺少了图片的一部分。您正在尝试比较两个不同的数组,每个数组都包含两种不同的类型。那应该马上就失败了……
-
哈哈不,它没有。