2013-04-12 6 views
6

मैंने पहले से ही कुछ घंटे बिताए हैं और मुझे कोई समाधान नहीं मिल रहा है। सबसे पहले, मैं क्या से कुछ विनिर्देशों:कोर डेटा असंगतता - कभी-कभी प्राप्त नहीं होती

  • ऑब्जेक्टिव-सी IOS 6 कोर डाटा
  • कोर डाटा के साथ एप्लिकेशन UIManagedDocument, जो स्वत: सहेजना UIManagedDocument से
  • ManagedContext चालू है संग्रहीत किया जाता है से आरंभ नहीं हो जाता एक स्थैतिक चर में और पूरे ऐप में पुन: उपयोग किया गया
  • ऐप RestKit का उपयोग करता है और मैं ActiveRecord श्रेणी का उपयोग करता हूं जो यह प्रदान करता है।

मेरे पास टीम इकाई के साथ एक मॉडल है। ऐप में, एक टीम सूची दृश्य नियंत्रक है, जो बैकएंड से टीमों को लोड करता है। बैकएंड जेएसओएन सरणी देता है, जिसमें दूसरों के बीच, टीम आईडी शामिल है। मैं इस आईडी को अपने मॉडल में "आईडी" फ़ील्ड में संग्रहीत करता हूं, और सर्वर प्रतिक्रिया पर पुनरावृत्ति करते समय, मैं देखता हूं कि दी गई आईडी के लिए टीम पहले से मौजूद है या नहीं। यदि ऐसा होता है, तो मैं केवल अपनी जानकारी अपडेट करता हूं और ऑब्जेक्ट पास करता हूं, अगर नहीं - तो मैं इसे पहले बना देता हूं।

और यह वह जगह है जहां यह विचित्र हो जाता है। यह 90% समय काम करता है। मैं टीम सूची नियंत्रक को लोड कर सकता हूं, ऐप में आगे जा सकता हूं, नियंत्रक पर वापस जा सकता हूं (जो डेटा को फिर से लोड करता है) और यह सब कुछ ठीक है। थोड़ी देर में, मेरे fetch अनुरोध कुछ भी वापस नहीं करेगा। जैसा कि:

NSArray *results = [context executeFetchRequest:request error:&error]; 

खाली सरणी वापस कर देगा, और त्रुटि भी खाली है। सर्वर पर कुछ भी नहीं बदल रहा है। अनुरोध, जब मैं यह डिबग करने के लिए प्रयास करते हैं, इस प्रकार दिखता है:

<NSFetchRequest: 0x127a0e20> (entity: Team; predicate: (id == "123"); sortDescriptors: ((null)); limit: 1; type: NSManagedObjectResultType;) 

जब मैं एक बाहरी अनुप्रयोग में SQLite दुकान का पूर्वावलोकन, मैं देख सकता है कि इस आईडी के लिए टीम आइटम मौजूद है, और अन्य 90% में बार यह वास्तव में लोड हो जाता है। क्या और भी अधिक विचित्र है, जब मैं SQLDebug बदल दिया है पर मैं देख सकता हूँ:

2013-04-12 12:00:27.934 SportLink[10831:c07] CoreData: annotation: fetch using 
NSSQLiteStatement <0x12656d10> on entity 'Team' with sql text 'SELECT 0, t0.Z_PK, 
t0.Z_OPT, t0.ZACI1, t0.ZACI2, t0.ZACI3, t0.ZALTFIRSTNAME, t0.ZALTSECONDNAME, t0.ZCOLOR1, 
t0.ZCOLOR2, t0.ZGENDER, t0.ZICON, t0.ZID, t0.ZLOCATION, t0.ZLOGO1, t0.ZLOGO2, t0.ZNAME, 
t0.ZTYPE, t0.ZSPORT FROM ZTEAM t0 WHERE t0.ZID = ? LIMIT 133' returned 6 rows 

जिसका अर्थ है कि समर्थन की दुकान वास्तव में डेटा दिलवाया, लेकिन किसी कारण से इसके साथ सफल नहीं हुआ। अब:

  • मैं मुख्य थ्रेड में सब कुछ कर रहा हूँ, तो यह एक मुद्दा
  • मुझे विश्वास है कि स्वत: सहेजने में भी कोई समस्या नहीं है नहीं है, क्योंकि यह और भी हो सकता है जब मैं अनुप्रयोग को बंद करने और इसे खोलने डेटा पहले से मौजूद है।

पृथ्वी पर क्या चल रहा है पर कोई विचार यहां जा रहा है?

संपादित करें: मैंने ऐप को इंस्ट्रूमेंट्स के साथ प्रोफाइल किया है। मैंने अभी समस्याग्रस्त वीसी में प्रवेश किया है, फिर अपने बच्चे के नियंत्रक में प्रवेश किया है और इसे दो बार दोहराया है, जब तक कि समस्या स्वयं प्रकट नहीं हो जाती। परिणाम यहां दिए गए हैं। शायद यह पता है कि यहां से चल रहा है आसान हो जाएगा:

Instruments output

+0

आप अपने 'TeamListVC' में अनुरोध कब फायर कर रहे हैं? परिणाम लोड होने पर आप क्या कर रहे हैं? थोड़ा और पता लगाने के आपके अनुरोध के बाद आप अतिरिक्त रूप से '[परिणाम गिनती]' लॉग कर सकते हैं। – flashfabrixx

+0

मुख्य संदर्भ के अंतराल को 0 –

+0

@ डैनशेली दुर्भाग्य से यह मदद नहीं करने की कोशिश की। – mav

उत्तर

5

जांच के कुछ दिनों के बाद, मैं अंत में इस बग के कारण मिल गया। कोड है कि टीम इकाई प्राप्त करते समय किया गया था इस तरह देखा:

Team *team = [Team findFirstByAttribute:WSK_ID withValue:data[WSK_ID] inContext:moc]; 

WSK_ID सिर्फ @"id" के लिए एक परिभाषित है।data एक शब्दकोश है जो मुझे एक JSON प्रतिक्रिया से RestKit से मिला है। क्योंकि इसे किसी भी प्रकार से नहीं डाला गया था, यह शायद एनएसएसटींग था, जबकि id टीम इकाई की संपत्ति एनएसएनंबर की उम्मीद कर रही थी। हालांकि मुझे नहीं पता कि यह कभी-कभी असफल रहा, इस बिट को बदलकर:

Team *team = [Team findFirstByAttribute:WSK_ID withValue:@([data[WSK_ID] intValue]) inContext:moc]; 

आईई। int को आईडी स्ट्रिंग कास्टिंग करना, और उसके बाद एनएसएनंबर के साथ मुक्केबाजी ने समस्या को हल किया।

+0

आईओएस पर एसक्लाइट 3 इंटरऑप, प्रकार रूपांतरण, आदि की बात आती है - चाहे आप CoreData का उपयोग करें या नहीं। मेरे अनुभव में, मैंने पाया है कि कोरडाटा सरल परिदृश्यों में सहायक है, लेकिन यह कुछ डेटा छिपाकर जटिलता भी जोड़ता है। – Brandon