2016-01-30 7 views
5

मैं अपने ऐप में क्लाउडकिट का उपयोग डेटा को दूरस्थ रूप से जारी रखने के तरीके के रूप में कर रहा हूं। मेरे रिकॉर्ड में से एक में एक सीकेएसेट संपत्ति है जिसमें एक छवि है। जब मैं रिकॉर्ड ला रहा हूं, मुझे एहसास हुआ कि क्वेरी को समाप्त करने में इतना समय लग रहा है। कई परीक्षणों के बाद, मैंने निष्कर्ष निकाला कि जब आप रिकॉर्ड पूछते हैं, क्लाउटकिट रिकॉर्ड ऑब्जेक्ट के साथ संपूर्ण संपत्ति फ़ाइल डाउनलोड करता है। इसलिए, जब आप रिकॉर्ड ऑब्जेक्ट से संपत्ति प्राप्त करते हैं और इसके fileURL का अनुरोध करते हैं, तो यह आपको एक स्थानीय फ़ाइल पथ यूआरएल देता है, न कि HTTP प्रकार का यूआरएल। यह मेरे लिए मुद्दा है क्योंकि क्वेरी को समाप्त होने से पहले उपयोगकर्ता को पूरे रिकॉर्ड डाउनलोड करने के लिए इतना समय इंतजार करना होगा (उनकी संबंधित छवियों के साथ)। एक पार्स पृष्ठभूमि से आ रहा है, पार्स आपको HTTP यूआरएल देने के लिए प्रयुक्त होता है और क्वेरी एसिंक लोड करते समय ऑब्जेक्ट्स के साथ यूआई लोड करने के लिए पर्याप्त तेज़ है। मेरा सवाल यह है कि मैं पार्स क्या हासिल कर सकता हूं? मुझे क्वेरी डेटा को डाउनलोड करने से प्रश्नों को प्रतिबंधित करने और छवियों को अतुल्यकालिक रूप से लोड करने के लिए एक लिंक प्राप्त करने की आवश्यकता है।डेटा डाउनलोड किए बिना सीकेएसेट यूआरएल प्राप्त करना

+0

कोई http url नहीं है। आप केवल एक स्थानीय यूआरएल प्राप्त कर सकते हैं। नीचे दिए गए उत्तर की तरह आप संपत्ति के बिना डेटा पूछने में सक्षम हैं। –

उत्तर

1

उसी रिकॉर्ड के लिए दो अलग-अलग कॉल करें। पहले कॉल को आपके द्वारा प्राप्त सभी गैर-संपत्ति फ़ील्ड प्राप्त करना चाहिए, और फिर दूसरा अनुरोध आवश्यक संपत्तियां प्राप्त करना चाहिए।

कुछ की तरह:

let dataQueryOperation = CKQueryOperation(query: CKQuery(predicate: myPredicate) 
dataQueryOperation.desiredKeys = ["name", "age"] // etc 
database.addOperation(dataQueryOperation) 

let imageQueryOperation = CKQueryOperation(query: CKQuery(predicate: myPredicate) 
imageQueryOperation.desiredKeys = ["images"] 
database.addOperation(imageQueryOperation) 

अगर जरूरत, एक विधि में इस refactor ताकि आप आसानी से हर संपत्ति युक्त क्षेत्र के लिए एक नई CKQueryOperation बना सकते हैं।

मुबारक शिकार।

0

अन्य लोगों की तरह कहा है कि आप सीकेएसेट के यूआरएल (वेब) नहीं प्राप्त कर सकते हैं। तो आपके सर्वोत्तम विकल्प हैं 1. प्रति व्यक्ति UIImageView के साथ प्रगति के साथ एक fetch ऑपरेशन का उपयोग करें। मैंने एक कस्टम बनाया है जो उपयोगकर्ता को प्रगति दिखाता है। कैश शामिल नहीं है लेकिन आप कक्षा बना सकते हैं और एनएससीओडी को अपनाने और पूरे रिकॉर्ड को कैश निर्देशिका में सहेज सकते हैं। यहां आप एक fetch देख सकते हैं कि मैं संपत्ति को वापस भेजने के लिए पूरा कर रहा हूं जहां मैं इसे अपने अन्य डेटा के साथ गठबंधन करने के लिए कहता हूं।

 // only get the asset in this fetch. we have everything else 

देना आपरेशन = CKFetchRecordsOperation (recordIDs: [myRecordID])

operation.desiredKeys = ["GameTurnImage"] 
     operation.perRecordProgressBlock = { 
      record,progress in 

      dispatch_async(dispatch_get_main_queue(), { 
       self.progressIndicatorView.progress = CGFloat(progress) 
      }) 

     } 

    operation.perRecordCompletionBlock = { 
     record,recordID,error in 
     if let _ = record{ 
      let asset = record!.valueForKey("GameTurnImage") as? CKAsset 

      if let _ = asset{ 

        let url = asset!.fileURL 
        let imageData = NSData(contentsOfFile: url.path!)! 
       dispatch_async(dispatch_get_main_queue(), { 

        self.image = UIImage(data: imageData) 
        self.progressIndicatorView.reveal() 

       }) 
       completion(asset!) 
      } 
     } 

    } 
    CKContainer.defaultContainer().publicCloudDatabase.addOperation(operation) 

अन्य विकल्प एक एडब्ल्यूएस सर्वर या कुछ और तुलनीय पर छवियों को स्टोर करने के लिए है और फिर आप सब करने के लिए SDWebImage की तरह कुछ का उपयोग कर सकते कैश या भारी उठाने और सीकेआरकॉर्ड में छवि में एक स्ट्रिंग को बचाने के लिए।

मैंने कई लोगों को एक यूआरएल का पर्दाफाश करने के लिए सीकेएसेट सुविधा के बारे में पूछा है। मुझे क्लाउडकिट के लिए जेएस एपी के बारे में पता नहीं है लेकिन इसके साथ ऐसा करने का एक तरीका हो सकता है लेकिन मैं दूसरों को उस पर आगे बढ़ने दूंगा।

3

आप संपत्ति के यूआरएल तक पहुंचने के लिए क्लाउडकिट जावास्क्रिप्ट का उपयोग कर सकते हैं। यहाँ एक उदाहरण है;

(Alamofire और SwiftyJSON प्रयुक्त)

func testRecordRequest() -> Request { 
    let urlString = "https://api.apple-cloudkit.com/database/1/" + Constants.container + "/development/public/records/query?ckAPIToken=" + Constants.cloudKitAPIToken 
    let query = ["recordType": "TestRecord"] 
    return Alamofire.request(.POST, urlString, parameters: ["query": query], encoding: .JSON, headers: nil) 
} 

JSON उत्तर संपत्ति के लिए एक "downloadURL" शामिल हैं।

"downloadURL": "https://cvws.icloud-content.com/B/.../${f}?o=AmVtU..." 

"$ {f}" एक चर की तरह लगता है तो इसे अपनी पसंद के अनुसार बदलें।

let downloadURLString = json["fields"][FieldNames.image]["value"]["downloadURL"].stringValue 
let recordName = json["recordName"].stringValue 
let fileName = recordName + ".jpg" 
let imageURLString = downloadURLString.stringByReplacingOccurrencesOfString("${f}", withString: fileName) 

और अब हम एक NSURL बनाने के लिए इस urlString का उपयोग करेगी और किंगफिशर के रूप में, HanekeSwift आदि किसी भी छवि & कैश समाधान के साथ उपयोग कर सकते हैं (आप छवि प्रकार पीएनजी/जेपीजी भी सहेजना चाहते हैं)

+0

बहुत बढ़िया चाल @anilgoktas, मुझे संदेह है, [Keys.image] क्या है? – drdrdrdr

+1

@drdrdrdr [Keys.image] -> रिकॉर्ड प्रकार पर छवि का फ़ील्ड नाम। आप इसे क्लाउडकिट डैशबोर्ड पर देख सकते हैं। यह उलझन में था, बस इसे बदल दिया। धन्यवाद – anilgoktas

+0

@anilgoktas यह अनुरोध 'serverErrorCode = "AUTHENTICATION_REQUIRED" लौटाता है; "' लॉगिन वेबपृष्ठ पर redirectURL के साथ। आपने इसे कैसे दूर किया? –

संबंधित मुद्दे