विफल रहता है: मैं डिवाइस ए पर एक iCloud दस्तावेज़ पर काम कर रहा हूं, उदा। आइपॉड टच। फिर मैं डिवाइस बी पर दस्तावेज़ का नाम बदलता हूं, उदा। मेरा मैक (खोजक के माध्यम से)। परिवर्तन क्लाउड तक जाता है और एक विराम डिवाइस के बाद ए को इसके बारे में सुनना पड़ता है।iCloud - किसी अन्य डिवाइस पर खुले दस्तावेज़ों का नाम बदलना कभी-कभी
और फिर:
- समय सब से कुछ ठीक है - मैं एक बदल
fileURL
संपत्ति के माध्यम से नाम परिवर्तन लेने और उसके अनुसार अपना इंटरफ़ेस अद्यतन कर सकते हैं - दस्तावेज़ बस के रूप में यह होना चाहिए व्यवहार करने के लिए जारी है - कुछ समय, दस्तावेज़ का fileURL कुछ ऐसा है जैसे:
file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95
कोई आश्चर्य की बात नहीं है कि यह फ़ाइल सहेज नहीं पाएगी।
क्या कोई यह बता सकता है कि क्या हो रहा है और इसके आसपास कैसे काम करना है?
पृष्ठभूमि
नाम बदलने
NSMetadataQuery
द्वारा ठीक उठाया जाता है के द्वारा। इसलिए, उदाहरण के लिए, मैं उन दस्तावेज़ों का नाम बदल सकता हूं जो खुले नहीं हैं और मेरी सभी iCloud कार्यक्षमता ठीक काम करती है। यह मुद्दा केवल खुले दस्तावेज़ों के साथ होता है।अन्य iCloud सुविधाएं ठीक काम कर रही हैं, उदा। मैं एक डिवाइस पर सामग्री बदल सकता हूं, उदा। मेरा मैक, और किसी अन्य डिवाइस पर मेरा इंटरफ़ेस अपडेट करें और फिर अपडेट करें, उदा। मेरा आईपॉड टच, जिसमें प्रासंगिक iCloud दस्तावेज़ खुला है।
मैंने पहली बार यह देखा जब मैंने
presentedItemDidMoveToURL:
के लिए अपने यूआईडी दस्तावेज़ उपखंड में ओवरराइड जोड़ा। ओवरराइड क्लाउड में किए गए नाम परिवर्तनों को विश्वसनीय रूप से चुनता है, उदा। किसी अन्य डिवाइस पर दस्तावेज़ का नाम बदलना। फिर कभी-कभी newURL नामित दस्तावेज़ के लिए अंतिम अपेक्षित यूआरएल है, यानी कुछ समझदार है जिससे मैं नया नाम 'lastPathComponent' का उपयोग कर सकता हूं, अपना इंटरफ़ेस अपडेट कर सकता हूं। अन्य अवसरों पर newURL किसी अन्य निर्देशिका में एक आखिरी निर्देशिका है पथ घटक 'purg-' शुरू होता है, उदाहरण के लिए purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95।- (void) presentedItemDidMoveToURL:(NSURL *) newURL; { [super presentedItemDidMoveToURL: newURL]; if ([(id)[self delegate] respondsToSelector:@selector(documentNameChanged:)]) { [[self delegate] documentNameChanged: self]; } }
presentedItemDidMoveToURL:
विधि समस्या के मूल कारण होने के लिए प्रतीत नहीं होता। उदाहरण के लिए, अगर मैं बिल्कुल कि विधि ओवरराइड नहीं है, लेकिन समय-समय पर एक का नाम बदलने के बाद ViewController कि खुले दस्तावेज़ के बाद लग रही है में चेक करें, फिर कभी कभीfileURL
नया नाम और कभी कभी यह वापस आ जाएगी वापस आ जाएगी `purg -..... '। तो यह मुद्दा ऐसा लगता है कि नामकरण कैसे किया जाता है।
अद्यतन
रूप al_lea ने कहा, यहां मुद्दा accommodatePresentedItemDeletionWithCompletionHandler:
से संबंधित था। Al_lea के उत्तर पर विस्तार करते हुए, मैंने नीचे दिए गए कोड को अपने यूआईडी दस्तावेज़ उपclass में जोड़ा। इस मुद्दे को ठीक किया गया।
- (void) accommodatePresentedItemDeletionWithCompletionHandler: (void (^) (NSError *errorOrNil)) completionHandler
{
PresentedDocument* presentedDocument = [self retain];
[presentedDocument closeWithCompletionHandler: ^(BOOL success) {
NSError* error = nil;
if (!success)
{
NSDictionary* userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
@"Could not close document that is being deleted on another device",
NSLocalizedDescriptionKey, nil];
error = [NSError errorWithDomain: @"some_suitable_domain"
code: 101
userInfo: userInfo];
}
completionHandler(error); // run the passed in completion handler (required)
dispatch_async(dispatch_get_main_queue(),^
{
[[NSNotificationCenter defaultCenter] postNotificationName: NOTIFY_presentedDocumentDeletedOnAnotherDevice
object: presentedDocument
userInfo: nil];
[presentedDocument tidyUpAfterDelete]; // app specific tidy up
[presentedDocument release];
});
}];
}
जगह में इस कोड के साथ
, वहाँ कोई नकली और भ्रामक presentedItemDidMoveToURL हैं: कॉल किए और, इसके अलावा में, प्रासंगिक वस्तु अन्य उपकरणों पर विलोपन की सूचनाओं के लिए सुन सकते हैं।
मैंने लगभग एक महीने के लिए केवल DocumentState का उपयोग करके iCloud काम करने की कोशिश की- यह वह टुकड़ा था जिसे मैं याद कर रहा था। इस कोड आइटम को जोड़ने से पहले कभी-कभी हटाने के बाद वापस आ जाएगा, या मुझे निरंतर बदलते दस्तावेज़ राज्यों की निरंतर स्ट्रीम मिल जाएगी –