title: Fetching CKAsset Image From CloudKit is Very Slow
body: <p>I am using CloudKit as a server backend for my iOS application. I'm using it to house some relatively static data along with a handful of images(CKAsset). I ran into a problem when the time came for me to actually fetch those assets from the public database. They load at an excruciatingly slow speed. </p>
  
  <p>My use case is to load an image into every cell inside of a collection view. The images are only 200kb in size, but the fetch process took an average of 2.2 seconds for the download to complete and set the image in a cell. For comparison, I took URLs of similar sized stock images and loaded them in using NSURLSession. It took a mere 0.18 - 0.25 seconds for each image to load. </p>
  
  <p>I have tried multiple different ways of downloading the images from CK: direct fetch of the record, query, and operation query. All of them have similar results. I am also dispatching back to the main queue within the completion block prior to setting the image for the cell. </p>
  
  <p>My database is setup to have a primary object with several fields of data. I then setup a backwards reference style system for the photos, where each photo just has a reference to a primary object. That way I can load the photos on demand without bogging down the main data.</p>
  
  <p>It looks something like this: </p>
  
  <p><strong>Primary Object:</strong>
  <code>title: String, startDate: Date</code></p>
  
  <p><strong>Photo Object:</strong>
  <code>owner: String(reference to primary object), image: Asset</code></p>
  
  <p>Here is an example request that I tried to directly fetch one of the photos:</p>
  
  <pre><code>let publicDb = CKContainer.defaultContainer().publicCloudDatabase
  let configRecordId = CKRecordID(recordName: "e783f542-ec0f-46j4-9e99-b3e3ez505adf")
  
  publicDb.fetchRecordWithID(configRecordId) { (record, error) -&gt; 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
      }
  }
  </code></pre>
  
  <p>I can't seem to figure out why these image downloads are taking so long, but it's really quite the showstopper if I can't get them to load in a reasonable about of time.</p>
  
  <p><em>Update: I tried the fetch operation with a smaller image, 23kb. The fetch was faster, anywhere from 0.3 - 1.1 seconds. That's better, but still doesn't meet the expectation that I had for what CloudKit should be able to provide.</em></p>