2011-01-27 14 views
8

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

2011-01-27 07:26:02.574 Zagazine[12298:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x3284b987 __exceptionPreprocess + 114 
    1 libobjc.A.dylib      0x31aca49d objc_exception_throw + 24 
    2 CoreData       0x3549d07b _PFRetainedObjectIDCore + 638 
    3 CoreData       0x3549cdfb - [NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:] + 14 
    4 CoreData       0x354bf85b -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] + 2170 
    5 CoreFoundation      0x327e9bbf -[NSObject(NSObject) performSelector:withObject:] + 22 
    6 Foundation       0x320fd795 __NSThreadPerformPerform + 268 
    7 CoreFoundation      0x328017dd __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12 
    8 CoreFoundation      0x327d34fb __CFRunLoopDoSources0 + 194 
    9 CoreFoundation      0x327d2e5b __CFRunLoopRun + 230 
    10 CoreFoundation      0x327d2c87 CFRunLoopRunSpecific + 230 
    11 CoreFoundation      0x327d2b8f CFRunLoopRunInMode + 58 
    12 GraphicsServices     0x3094a4ab GSEventRunModal + 114 
    13 GraphicsServices     0x3094a557 GSEventRun + 62 
    14 UIKit        0x32c14329 -[UIApplication _run] + 412 
    15 UIKit        0x32c11e93 UIApplicationMain + 670 
    16 ArticleApp       0x0000233f main + 70 
    17 ArticleApp       0x000022f4 start + 40 
) 
terminate called after throwing an instance of 'NSException' 
Program received signal: “SIGABRT”. 

यह दिलचस्प बात यह है कि इस त्रुटि को केवल पहली बार मैं इसे स्थापित करने के बाद एप्लिकेशन लॉन्च होता है। इसके बाद के सभी लॉन्च किए गए काम ठीक होने के बाद। क्या कोई जानता है कि यह त्रुटि क्यों हो रही है और यह केवल प्रारंभिक स्थापना पर क्यों होगी।

इसके अलावा, इस तरह मैं संदर्भ विलय कर रहा हूँ, इस पृष्ठभूमि के धागे पर कहा जाता है, जब यह सूचना प्राप्त है:

- (void)mergeChanges:(NSNotification *)notification { 
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate; 
    NSManagedObjectContext *mainContext = [appDelegate managedObjectContext]; 

    // Merge changes into the main context on the main thread 
    [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
           withObject:notification 
          waitUntilDone:YES]; 
} 

उत्तर

17

This interesting part is that this error only occurs the first time I launch the app after installing it. All subsequent launches after it's installed work fine. Does anyone know why this error is happening and why it would only happen on initial install.

मेरा अनुमान है तो जाता है कि लगातार दुकान सही ढंग से करने के लिए संबद्ध नहीं है पहले लॉन्च पर डिस्क पर फ़ाइल सही ढंग से। जब आप लगातार स्टोर समन्वयक को अपना यूआरएल असाइन करते हैं तो कोर डेटा स्टोर का समर्थन करने वाली फ़ाइल भौतिक नहीं होती है। यह केवल पहले सहेजे जाने पर ही भौतिक होता है।

और बैक की गई फ़ाइल तैयार किए बिना परिवर्तन विलय करने से कई समस्याएं होती हैं।

पृष्ठभूमि थ्रेड बनाने से पहले कोर डेटा संदर्भ अभी भी खाली होने पर, पहले प्रक्षेपण में बहुत पहले मुख्य प्रक्षेपण से संदर्भ को सहेजने का प्रयास करें। उम्मीद है कि आपकी समस्या का समाधान होगा।

+0

हाँ जो काम करता है, मैंने ऐप लॉन्च पर सभी ऑब्जेक्ट्स को हटाने के लिए कोड जोड़ा है इससे पहले कि कोई अन्य पृष्ठभूमि सामान खुश हो और यह चाल हो। क्या यह सामान्य है? क्या मेरे डिजाइन में कुछ गड़बड़ है? मैंने वर्तमान में एप्लिकेशन में सिंक ऑपरेशन कतार शुरू की है: didFinishLaunchingWithOptions जो डेटा और आवेषण डाउनलोड करता है। – marchinram

+1

सहेजते समय आपको ऑब्जेक्ट्स को हटाना नहीं है। जब मैंने कहा कि कोर डेटा संदर्भ खाली होने पर आपको एक बार सहेजना चाहिए, तो मेरा मतलब यह था कि आपको किसी भी डिवाइस पर स्थापित होने के बाद पहली बार लॉन्च होने पर, शुरुआत में ही बचाया जाना चाहिए। आपका डिजाइन मेरे लिए बिल्कुल ठीक है। यह सिर्फ पृष्ठभूमि धागे से कोर डेटा तक पहुंच है ... मुश्किल है! – Yuji

+0

मैं विशुद्ध रूप से परीक्षण के लिए वस्तुओं को हटा दें, मैं एक वेब सेवा से json डाउनलोड करने और अपने स्टोर में डालें, तो मैं इसे बाहर का परीक्षण करने के json डेटा बदलना चाहते। भ्रम के लिए खेद है और आपके उत्तर के लिए धन्यवाद। एक अच्छा 'अनुमान' के लिए +1 – marchinram

0

क्या आपके पास कोई अन्य संदर्भ mergeChangesFromContextDidSaveNotification अधिसूचना किसी अन्य संदर्भ द्वारा देखा जा रहा है? यदि ऐसा है, तो यह आदेश हो सकता है कि आप अधिसूचित कर रहे हैं। यह एक संदर्भ जो स्कीमा परिवर्तन करने के लिए प्रभावित कर रहे हैं के बारे में पता नहीं है की सूचना देना हो सकता है (उर्फ, 'वस्तु के लगातार दुकान नहीं इस NSManagedObjectContext के समन्वयक से पहुंचा जा सकता है')।

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