Как получить все записи CloudKit, созданные текущим пользователем?

Скажем, у меня есть тип записи «Виды», содержащий общедоступные записи, созданные несколькими пользователями. В настоящее время мой запрос извлекает все записи "Виды":

private func fetchSpecies() {
    // Fetch Public Database
    let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase

    // Initialize Query
    let query = CKQuery(recordType: "Species", predicate: NSPredicate(format: "TRUEPREDICATE"))

    // Configure Query
    query.sortDescriptors = [NSSortDescriptor(key: "latinName", ascending: true)]

    // Perform Query
    publicDatabase.performQuery(query, inZoneWithID: nil) { (records, error) -> Void in
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        // Process Response on Main Thread
        self.processResponseForQuery(records, error: error)
        })
    }
}

Как я могу получить только те записи, которые были созданы текущим пользователем (например, владельцем устройства)?

Спасибо!


person Matt Mac    schedule 08.02.2016    source источник


Ответы (2)


Я также разместил сообщения на форумах разработчиков Apple, и мне предоставили отличное решение:

Чтобы получить только определенные пользовательские записи, вам нужно создать CKReference, указывающий на этот идентификатор пользователя (recordID), а затем использовать для него предикат. Выглядит это так:

Сначала получите идентификатор записи пользователя

yourContainer.fetchUserRecordIDWithCompletionHandler { (userID, error) -> Void in  
    if let userID = userID {  
        // here's your userID (recordID) to play with  
    }  
}

Затем создайте предикат:

let reference = CKReference(recordID: userID, action: .None)  
let predicate = NSPredicate(format: "creatorUserRecordID == %@", reference)  
let query = CKQuery(recordType: "Species", predicate: predicate) 

А затем используйте запрос как обычно.

Удачной покупки!

person Matt Mac    schedule 13.04.2016

Каждый CKRecord имеет свойство creatorUserRecordID; поэтому вы можете сначала попытаться получить userRecordID владельца. Затем поместите это в NSPredicate.

let container: CKContainer = CKContainer.defaultContainer()
let completionHandler: (CKRecordID?, NSError?) -> Void = { (userRecordID: CKRecordID?, error: NSError?) in
    if let userRecordID = userRecordID {
        let predicate = NSPredicate(format: "creatorUserRecordID == %@", userRecordID)
        let query = CKQuery(recordType: "Species", predicate: predicate)
        query.sortDescriptors = [NSSortDescriptor(key: "latinName", ascending: true)]
        container.publicCloudDatabase.performQuery(query, inZoneWithID: nil) { (records, error) -> Void in

        }
    }
}
//// Returns the user record ID associated with the current user.
container.fetchUserRecordIDWithCompletionHandler(completionHandler)
person Allen    schedule 08.02.2016