मैं क्लाउडकिट के साथ काम करना शुरू कर रहा हूं, इसलिए मेरे साथ भालू।क्लाउडकिट - निर्भरता के साथ CKQueryOperation
पृष्ठभूमि की जानकारी
WWDC 2015 में, सेब CloudKit https://developer.apple.com/videos/wwdc/2015/?id=715
के बारे में बात करते हैं इस बात में दिया था, वे चेनिंग प्रश्नों बनाने के खिलाफ चेतावनी दी है और इसके बजाय इस रणनीति की सिफारिश:
let firstFetch = CKFetchRecordsOperation(...)
let secondFetch = CKFetchRecordsOperation(...)
...
secondFetch.addDependency(firstFetch)
letQueue = NSOperationQueue()
queue.addOperations([firstFetch, secondFetch], waitUntilFinished: false)
उदाहरण संरचना
परीक्षण परियोजना डेटाबेस जानवरों और उनके मालिकों में शामिल है, यह इस तरह दिखता है:
|Pets | |Owners |
|-name | |-firstName |
|-birthdate | |-lastName |
|-owner (Reference) | | |
मेरे प्रश्न
मैं सभी पालतू जानवरों है कि एक स्वामी का होना खोजने की कोशिश कर रहा हूँ, और मैं चिंतित हूँ मैं मैं चेन सेब बना रहा हूँ चेतावनी देता है। दो विधियों के लिए नीचे देखें जो एक ही काम करते हैं, लेकिन दो तरीकों से। कौन सा सही है या दोनों गलत हैं? मुझे लगता है कि मैं वही काम कर रहा हूं लेकिन इसके बजाय पूर्णता ब्लॉक का उपयोग कर रहा हूं।
मैं अन्य खोज BtnClick को बदलने के बारे में उलझन में हूं: निर्भरता का उपयोग करने के लिए। मैं कहाँ otherSearchBtnClick में
ownerQueryOp.addDependency(queryOp)
से जोड़ना होगा :?
@IBAction func searchBtnClick(sender: AnyObject) {
var petString = ""
let container = CKContainer.defaultContainer()
let publicDatabase = container.publicCloudDatabase
let privateDatabase = container.privateCloudDatabase
let predicate = NSPredicate(format: "lastName == '\(ownerLastNameTxt.text)'")
let ckQuery = CKQuery(recordType: "Owner", predicate: predicate)
publicDatabase.performQuery(ckQuery, inZoneWithID: nil) {
record, error in
if error != nil {
println(error.localizedDescription)
} else {
if record != nil {
for owner in record {
let myRecord = owner as! CKRecord
let myReference = CKReference(record: myRecord, action: CKReferenceAction.None)
let myPredicate = NSPredicate(format: "owner == %@", myReference)
let petQuery = CKQuery(recordType: "Pet", predicate: myPredicate)
publicDatabase.performQuery(petQuery, inZoneWithID: nil) {
record, error in
if error != nil {
println(error.localizedDescription)
} else {
if record != nil {
for pet in record {
println(pet.objectForKey("name") as! String)
}
}
}
}
}
}
}
}
}
@IBAction func otherSearchBtnClick (sender: AnyObject) {
let container = CKContainer.defaultContainer()
let publicDatabase = container.publicCloudDatabase
let privateDatabase = container.privateCloudDatabase
let queue = NSOperationQueue()
let petPredicate = NSPredicate(format: "lastName == '\(ownerLastNameTxt.text)'")
let petQuery = CKQuery(recordType: "Owner", predicate: petPredicate)
let queryOp = CKQueryOperation(query: petQuery)
queryOp.recordFetchedBlock = { (record: CKRecord!) in
println("recordFetchedBlock: \(record)")
self.matchingOwners.append(record)
}
queryOp.queryCompletionBlock = { (cursor: CKQueryCursor!, error: NSError!) in
if error != nil {
println(error.localizedDescription)
} else {
println("queryCompletionBlock: \(cursor)")
println("ALL RECORDS ARE: \(self.matchingOwners)")
for owner in self.matchingOwners {
let ownerReference = CKReference(record: owner, action: CKReferenceAction.None)
let ownerPredicate = NSPredicate(format: "owner == %@", ownerReference)
let ownerQuery = CKQuery(recordType: "Pet", predicate: ownerPredicate)
let ownerQueryOp = CKQueryOperation(query: ownerQuery)
ownerQueryOp.recordFetchedBlock = { (record: CKRecord!) in
println("recordFetchedBlock (pet values): \(record)")
self.matchingPets.append(record)
}
ownerQueryOp.queryCompletionBlock = { (cursor: CKQueryCursor!, error: NSError!) in
if error != nil {
println(error.localizedDescription)
} else {
println("queryCompletionBlock (pet values)")
for pet in self.matchingPets {
println(pet.objectForKey("name") as! String)
}
}
}
publicDatabase.addOperation(ownerQueryOp)
}
}
}
publicDatabase.addOperation(queryOp)
}
क्या कोई जवाब नहीं है क्योंकि मैं अब तक बेस से दूर हूं, मैं निराश हूं ?! – Charlie