Sto utilizzando CloudKit come back-end del server per la mia applicazione iOS. Lo sto usando per contenere alcuni dati relativamente statici insieme a una manciata di immagini (CKAsset). Mi sono imbattuto in un problema quando è giunto il momento per me di recuperare effettivamente tali risorse dal database pubblico. Caricano a una velocità atrocemente lenta.Il recupero dell'immagine CKAsset da CloudKit è molto lento
Il mio caso d'uso è di caricare un'immagine in ogni cella all'interno di una vista di raccolta. Le immagini hanno una dimensione di soli 200 kB, ma il processo di recupero ha richiesto in media 2,2 secondi per il completamento del download e l'impostazione in una cella. Per fare un confronto, ho preso URL di immagini di dimensioni simili e li ho caricati usando NSURLSession. Ci sono voluti solo 0,18 - 0,25 secondi per ogni immagine da caricare.
Ho provato più modi diversi di scaricare le immagini da CK: recupero diretto del record, query e query di operazione. Tutti hanno risultati simili. Sto anche tornando alla coda principale all'interno del blocco di completamento prima di impostare l'immagine per la cella.
Il mio database è configurato per avere un oggetto primario con diversi campi di dati. Quindi ho impostato un sistema di stile di riferimento all'indietro per le foto, in cui ogni foto ha solo un riferimento a un oggetto primario. In questo modo posso caricare le foto su richiesta senza appesantire i dati principali.
Sembra qualcosa di simile a questo:
oggetto primario: title: String, startDate: Date
Foto Oggetto: owner: String(reference to primary object), image: Asset
Ecco un esempio di richiesta che ho cercato di prendere direttamente una delle foto:
let publicDb = CKContainer.defaultContainer().publicCloudDatabase
let configRecordId = CKRecordID(recordName: "e783f542-ec0f-46j4-9e99-b3e3ez505adf")
publicDb.fetchRecordWithID(configRecordId) { (record, error) -> Void in
dispatch_async(dispatch_get_main_queue()) {
guard let photoRecord = record else { return }
guard let asset = photoRecord["image"] as? CKAsset else { return }
guard let photo = NSData(contentsOfURL: asset.fileURL) else { return }
let image = UIImage(data: photo)!
cell.cardImageView.image = image
}
}
Non riesco a capire perché questi download di immagini stiano prendendo così tanto tempo, ma è davvero abbastanza stressante se non riesco a farli caricare in un tempo ragionevole.
Aggiornamento: ho provato l'operazione di recupero con un'immagine più piccola, 23kb. Il recupero è stato più veloce, ovunque da 0,3 a 1,1 secondi. È meglio, ma non soddisfa ancora l'aspettativa che ho avuto per ciò che CloudKit dovrebbe essere in grado di fornire.
stai recuperando l'intero record. Ci sono più risorse in quel disco? Potresti limitarlo solo al campo dell'immagine.Oltre a questo, devi solo eseguire l'ultima istruzione in cui aggiorni l'interfaccia utente nella coda principale. –
@EdwinVermeer Il record con la risorsa ha semplicemente due campi, uno è l'immagine, l'altro è un valore stringa con un riferimento al proprietario. So che posso spostare quelle altre linee dal dispacciamento alla coda principale, ma non fa differenza. Il blocco di completamento del recupero è ciò che impiega per sempre per essere chiamato, non le prestazioni di ciò che è all'interno di quel blocco. – Jonathan
Che tipo di rete stai testando? Si consiglia di verificare la priorità dell'operazione, provare anche a recuperare manualmente il record, invece di utilizzare i metodi di convenienza. – mattsven