मैं Core Data with a Single Shared UIManagedDocument पर जस्टिन ड्रिस्कॉल के कार्यान्वयन का उपयोग कर रहा हूं। जब तक मैं इसे आईपैड स्टोरीबोर्ड पर नहीं ले जाता और आईपैड ऐप के लिए स्प्लिटव्यू कंट्रोलर तक नहीं जाता तब तक सब कुछ मेरे आईफोन ऐप में ठीक था। समस्या openwithCompletionHandler को दो बार बुलाया जा रहा है, एक बार मेरे मास्टर व्यू सेडिडलोड में और फिर मेरे विवरण में ViewWillLoad देखें। कॉल त्वरित उत्तराधिकार में हैं और चूंकि दस्तावेज़ अभी भी UIDocumentStateClosed में है, जब सिंगलटन के मेरे प्रदर्शन WithDocument विधि (नीचे) में दूसरा कॉल किया जाता है, तो ऐप क्रैश हो जाता है। मैंने iOS5.1: synchronising tasks (wait for a completion) पोस्ट के लिए e_x_p का जवाब देखा लेकिन @Sychronized इस मामले में काम नहीं करेगा क्योंकि नीचे दिए गए प्रदर्शन के साथ ही उसी थ्रेड पर कॉल किया गया है। मैं OpenwithCompletionHandler के साथ खोलने के लिए एकाधिक कॉल के खिलाफ कैसे रक्षा करूं? इसके खिलाफ सुरक्षा के लिए एकमात्र तरीका यह है कि ऊपर दिए गए कॉल में से किसी एक के निष्पादन को रोकना है जब तक कि मुझे यकीन नहीं है कि UIDocumentStateNormal सत्य है और फिर रिलीज़ करें। हालांकि वह मुख्य यूआई थ्रेड को फ्रीज करेगा जो अच्छा नहीं है। यूआई को ठंडा किए बिना इसे करने का सबसे अच्छा तरीका क्या होगा?UIManagedDocument सिंगलटन कोड openWithCompletionHandler को दो बार और क्रैश कहा जाता है
UIManagedDocumentSingleton कोड से:
- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success)
{
onDocumentReady(self.document);
};
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])
{
//This should never happen*******************
[self.document saveToURL:self.document.fileURL
forSaveOperation:UIDocumentSaveForCreating
completionHandler:OnDocumentDidLoad];
} else if (self.document.documentState == UIDocumentStateClosed) {
[self.document openWithCompletionHandler:OnDocumentDidLoad];
} else if (self.document.documentState == UIDocumentStateNormal) {
OnDocumentDidLoad(YES);
}
}
मैं एक ही प्रारंभिक कॉल जो cellForRowAtIndexPath और numberOfRowsInSection अब इस प्रकार का उपयोग करने के लाने का अनुरोध समेकित है अब और समस्या नहीं है, लेकिन समस्या अभी भी मौजूद। मैंने इसे सरल बनाने के लिए इस मुद्दे को अद्यतन किया है। –
क्या आप ऑब्जेक्ट पर सिंक करने के लिए 'सिंक्रनाइज़ (दस्तावेज़ ऑब्जेक्ट)' कर सकते हैं? छोड़कर यह एक तरीका है कि आप मास्टर/विस्तार से प्राधिकारी को प्रतिनिधि दे सकते हैं ताकि उनमें से केवल एक को कॉल करने की आवश्यकता हो (या यदि उनके पास निष्पादन आदेश की गारंटी है, तो आप उनके बीच एक संदेश (संभवतः 'प्रोटोकॉल' के माध्यम से) पास कर सकते हैं पहली बार किया जाता है जब दूसरे पर निष्पादित करें। –