Ich spielte mit der Idee, 2 Datenfelder zu vergleichen, von denen jedes aus einer Struktur aufgebaut ist. Die mögliche Idee dahinter war, ein Array von lokalen Daten mit einem Array aus Netzwerkdaten zu vergleichen. Wenn sie identisch sind, verwenden Sie die lokalen Daten, um Zeit zu sparen, insbesondere wenn einige der Daten Bilder sind.Vergleichen 2 struct Arrays
Basic-Code ich verspottet zum Testen ist unten, aber ich kann nicht in der Lage sein, die Array zu vergleichen, weil sie von einer Struktur sind? Gibt es einen Weg dahin?
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")
}
}
}
----------------- EDIT --------------------
Dank für die Lösung WERUreo.
Am Ende musste ich den equatable Teil zu einer Erweiterung der Struktur verschieben, um es zu arbeiten. Ich bin mir sicher, dass die Art und Weise, wie Sie gezeigt haben, funktioniert, ich konnte es einfach nicht ohne Fehler passieren lassen.
Vergleichen Sie die Arrays, nur das Problem, das ich jetzt habe, ist, dass die Arrays nicht vollständig von der Zeit gefüllt sind, die ich den Compare-Code ausführen, wie ich die Daten im Hintergrund bekomme. Haben Sie eine Idee, wie Sie auf das Array warten müssen, bevor Sie den zu vergleichenden Code ausführen?
innen Hauptklasse
struct myStruct {
var packName : String
var packDescription : String
var packTitle : String
var packImage : PFFile
var packID: String
}
außerhalb Hauptklasse
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
}
Wird der Code überhaupt kompiliert? Wenn es so ist, habe ich das Gefühl, dass wir einen Teil des Bildes vermissen. Sie versuchen, zwei verschiedene Arrays zu vergleichen, die jeweils zwei verschiedene Typen enthalten. Das sollte auf Anhieb scheitern ... – WERUreo
haha nein tut es nicht. – Pippo