2016-01-14 1 views
0

У меня есть таблица с тремя текстовыми полями и изображением (CKAsset). Изображения большие. Я хочу запросить таблицу и получить только 2 текстовые поля, не загружая изображение. Есть ли способ указать, что мне нужно только 2 текстовых поля?cloudkit - я не хочу, чтобы изображения с моей таблицей загружались

Это код, я использую:

let predicate = NSPredicate(format: "CloudID = %@", tempCloudID) 
    let query = CKQuery(recordType: "Images", predicate: predicate) 
    query.sortDescriptors = [NSSortDescriptor(key: "Field1", ascending: true)] 
    query.sortDescriptors = [NSSortDescriptor(key: "Field2", ascending: true)] 

До сих пор не могут запрашивать таблицы, они магазин должным образом, хотя со ссылкой, и удаляются при удалении таблицы, владеющей.

func test() { 
    //This works for storing my images, and I can delete the parent and it successfully removes all images. That’s what I want. 
    let parentId = CKRecordID(recordName: uploadList[uploadRecord].CloudID) 
    let parent = CKReference(recordID: parentId, action: CKReferenceAction.DeleteSelf) 
    let outputPath = NSHomeDirectory().stringByAppendingString("/Library/Pictures/" + uploadList[uploadRecord].File) 
    let File: CKAsset? = CKAsset(fileURL: NSURL(fileURLWithPath: outputPath)) 
    let imageRecord = CKRecord(recordType: "Images") 
    imageRecord.setObject(uploadList[uploadRecord].R, forKey: "R") 
    imageRecord.setObject(uploadList[uploadRecord].A, forKey: "A") 
    imageRecord.setObject(parent, forKey: "Reference") 
    imageRecord.setValue(File, forKey: "Image") 
    publicDB.saveRecord(imageRecord, completionHandler: ({returnRecord, error in 
     if let err = error { 
      self.notifyUser("Save Image Error", message: 
       err.localizedDescription) 
      print("Image Upload Error") 
     } else { 
      dispatch_async(dispatch_get_main_queue()) { 
       print("Image Sent Successfully") 
       // Mark image to be deleted? 
      } 
     } 
    })) 

} 

Я пробовал дополнить запрос и выполнить запрос. Я делаю что-то неправильно, не уверен, что это такое.

ответ

2

Вы могли бы решить эту проблему в 2 способами:

  1. Вы можете использовать CKQueryOperation, где вы можете определить desiredKeys. Затем вам придется запрашивать/получать одну и ту же запись с ключом для актива, если вы хотите получить актив. Вы можете сделать это с помощью fetchRecordWithID. Недостатком этого является то, что он снова получит всю запись. Если запись содержит 2 актива, вы не можете указать, чтобы получить только один.
  2. Вы можете поместить свои CKAssets в отдельный файл recordType и установить для него CKReference. Затем вы можете выборочно получить только эту запись о конкретном активе.

P.S. Запрос ссылки, как просили ниже можно сделать с помощью следующего кода:

let parentId = CKRecordID(recordName: referenceRecordName) 
let parent = CKReference(recordID: parentId, action: CKReferenceAction.None) 
let query = CKQuery(recordType: recordType, predicate: NSPredicate(format: "%K == %@", referenceField ,parent)) 
+0

У меня есть только 2 таблицы прямо сейчас, я не поставил их с помощью CKReference прямо сейчас, я устанавливаю «CloudID» во второй таблице как идентификатор из первой таблицы. Я посмотрел на CKReference, но не понимаю документацию, чтобы заставить ее работать и не может найти хороший пример. Я не хочу добавлять другую таблицу, не используя надлежащую CKReference, поскольку мне придется отслеживать другой идентификатор. Следующий шаг после того, как я сделаю это, - это получить изображения, прямо сейчас мне нужен список изображений для их выбора. Я попробую CKQueryOperation. Я действительно должен добавить zoneID и CKReferences. – Grumpy

+0

Я все еще не могу найти способ установить CKReference в этой таблице. TempCloudID = 13886D9B-8389-4253-981D-51DCD573BA05, и это должно быть владельцем. Как установить для таблицы «Изображения» ссылку на этот идентификатор? – Grumpy

+0

Я исправил предыдущую ошибку, используя CKQueryOperation. Теперь у меня есть ошибка на следующем экране, где я пытаюсь открыть изображение. Я использую let predicate = NSPredicate (format: "recordID =% @", myRecordID). myRecordID = 3F1CF4EC-95F4-4659-AA47-B00048B3BBAE. Ошибка: Поле '__recordID' имеет тип значения ссылки и не может быть запрошено с помощью строки типа значения фильтра. – Grumpy