2016-05-01 11 views
0

Wenn ich für Datensätze mit Feldern holen, die Strings (oder andere) sind es dauert weniger als 1 Sekunde:CKQuery langsam mit CKAssets

let query = CKQuery(recordType: "Messages", predicate: NSPredicate(format: "TRUEPREDICATE")) 
    NSLog("Started fetching") 
    self.publicDb.performQuery(query, inZoneWithID: nil) { (records, error) in 
     NSLog("Finished fetching") 
     print(records!.count) 
    } 

Aber, wenn diese Art Datensatz einen CKAsset enthält, die Zeit für die Abfrage geht bis zu mindestens 3 Sekunden. Dies ist nicht akzeptabel, wenn ich ein Bild mit 100 KB laden möchte. Es ist das gleiche, wenn ich das Asset als Referenz einfüge und es von dort lade. Was kann ich tun, um Abfragen für Datensätze zu beschleunigen, die Assets enthalten, oder gibt es andere Möglichkeiten, Assets effizienter zu speichern?

+0

1) Assets sind groß im Vergleich zu Nur-Text-Feldern. Sie werden viel länger dauern. Nichts, was du tun kannst, außer sie kleiner zu machen. 2) Verwenden Sie eine 'CKQueryOperation' anstelle von' performQuery'. Es ist schneller und hat viel mehr Flexibilität. – rmaddy

+0

Sie könnten Vermögenswerte woanders speichern? Verwenden einer API aus einer anderen Quelle wie Dropbox. Ich lese auch, dass in der Produktion die Dinge schneller sind, aber am besten darauf zu achten. Andere Lösungen, verwenden Sie Ihren eigenen http-Server als Backing-Store oder in der Tat verwenden Sie Links und laden Sie es überhaupt nicht. – user3069232

Antwort

1

eine Operation verwenden und die Servicequalität gesetzt:

CKQueryOperation *queryOperation = [[CKQueryOperation alloc] initWithQuery:query]; 

queryOperation.qualityOfService = NSQualityOfServiceUserInitiated; 

Wenn Sie QualityOfService nicht gesetzt ist, wird die Hintergrundebene erhalten und es wird langsam sein.

+0

Dies ist eine gute Antwort. Der schnellste (aber teuerste) 'qualityOfService' ist' NSQualityOfServiceUserInteractive'. –