का उपयोग कर रहा हूं, मैं अपना पहला आईओएस ऐप बना रहा हूं, जो सिद्धांत में बहुत सरल होना चाहिए, लेकिन मुझे ऐप स्टोर में इसे आत्मविश्वास महसूस करने के लिए पर्याप्त बुलेटप्रूफ बनाने में कठिनाई हो रही है।कोर डेटा समवर्ती और विश्वसनीय रूप से
संक्षेप में, मुख्य स्क्रीन में एक तालिका दृश्य होता है, एक पंक्ति का चयन करने पर यह किसी अन्य तालिका दृश्य में सेग करता है जो चयनित पंक्ति के लिए मास्टर-विवरण फैशन में प्रासंगिक जानकारी प्रदर्शित करता है। अंतर्निहित डेटा दिन में एक बार वेब सेवा से JSON डेटा के रूप में पुनर्प्राप्त किया जाता है और फिर कोर डेटा स्टोर में कैश किया जाता है। SQLite डेटाबेस फ़ाइल को अनिश्चित काल तक बढ़ने से रोकने के लिए उस दिन से पहले का डेटा हटा दिया गया है। सभी डेटा दृढ़ता संचालन कोर डेटा का उपयोग करके किया जाता है, जिसमें NSFetchedResultsController
विस्तार तालिका दृश्य को कम किया जाता है।
समस्या जो मैं देख रहा हूं वह यह है कि यदि आप ताजा डेटा पुनर्प्राप्त किए जाते हैं, तो पार्स और सहेजे जाते हैं, तो ऐप फ्रीज या क्रैश पूरी तरह से मास्टर और विस्तार स्क्रीन के बीच कई बार स्विच करता है। ऐसा लगता है कि कुछ प्रकार की दौड़ की स्थिति हो सकती है, शायद मूल डेटा पृष्ठभूमि में डेटा आयात करने के कारण, मुख्य धागा एक fetch करने की कोशिश कर रहा है, लेकिन मैं अनुमान लगा रहा हूं। मुझे किसी भी सार्थक क्रैश जानकारी को कैप्चर करने में परेशानी हुई है, आमतौर पर यह कोर डेटा स्टैक में एक SIGSEGV गहराई है।
नीचे दी गई तालिका कि हो सकता है जब विस्तार तालिका दृश्य नियंत्रक लोड किया जाता है की घटनाओं के वास्तविक क्रम दिखाता है:
Main Thread Background Thread viewDidLoad Get JSON data (using AFNetworking) Create child NSManagedObjectContext (MOC) Parse JSON data Insert managed objects in child MOC Save child MOC Post import completion notification Receive import completion notification Save parent MOC Perform fetch and reload table view Delete old managed objects in child MOC Save child MOC Post deletion completion notification Receive deletion completion notification Save parent MOC
एक बार AFNetworking पूरा होने के ब्लॉक शुरू हो रहा है जब JSON डेटा आ गया है, एक नेस्टेड NSManagedObjectContext
बनाई गई है और एक "आयातक" ऑब्जेक्ट को पास किया जो JSON डेटा को पार करता है और ऑब्जेक्ट को कोर डेटा स्टोर में सहेजता है। आयातक नए performBlock
विधि iOS 5 में शुरू की का उपयोग कर कार्यान्वित:
NSManagedObjectContext *child = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:self.managedObjectContext];
[child performBlock:^{
// Create importer instance, passing it the child MOC...
}];
आयातक वस्तु का मानना है अपनी ही एमओसी के NSManagedObjectContextDidSaveNotification
और फिर अपनी ही अधिसूचना जो विस्तार तालिका दृश्य नियंत्रक द्वारा मनाया जाता है पोस्ट। जब यह अधिसूचना पोस्ट की जाती है तो तालिका दृश्य नियंत्रक अपने (पैरेंट) एमओसी पर एक बचत करता है।
दिन के नए डेटा के आयात के बाद पुराने डेटा को हटाने के लिए मैं "डिलीटर" ऑब्जेक्ट के साथ एक ही मूल पैटर्न का उपयोग करता हूं। नए डेटा को प्राप्त किए गए परिणाम नियंत्रक द्वारा प्राप्त किए जाने के बाद यह असंकालिक रूप से होता है और विवरण तालिका दृश्य को पुनः लोड किया गया है।
एक चीज जो मैं नहीं कर रहा हूं वह किसी मर्ज नोटिफिकेशन को देख रहा है या किसी भी प्रबंधित ऑब्जेक्ट संदर्भ या लगातार स्टोर समन्वयक को लॉक कर रहा है। क्या यह कुछ मुझे करना चाहिए? मैं थोड़ा सा अनिश्चित हूं कि यह सब सही ढंग से कैसे आर्किटेक्ट करें ताकि किसी भी सलाह की सराहना की जा सके।
मुझे यह विचार पसंद है, मुझे यह पसंद है ** बहुत **। यह भी लाभ है कि SQL डेटा फ़ाइल का एक फ़ाइल सिस्टम डिलीट ऑब्जेक्ट ग्राफ़ में प्रबंधित ऑब्जेक्ट को हटाए जाने से बहुत तेज़ होगा, हालांकि निश्चित रूप से वास्तव में विलोपन प्रदर्शन कोई फर्क नहीं पड़ता क्योंकि एक अलग निरंतर स्टोर होगा वैसे भी इस्तेमाल किया। मैं इस सप्ताह के अंत में इस दृष्टिकोण को जाने जा रहा हूं। –