2015-10-16 25 views
8

कभी-कभी (शायद ही कभी होता है) मुझे Object has been deleted or invalidated. त्रुटि मिली, जब मेरी मॉडल ऑब्जेक्ट को किसी संपत्ति या एफ़नेटवर्किंग ब्लॉक के अंदर संशोधित करने का प्रयास किया गया। क्या कोई मुझे यह जानने में मदद कर सकता है कि मैं क्या गलत कर रहा हूं?त्रुटि: ऑब्जेक्ट हटा दिया गया है या अमान्य कर दिया गया है। (दायरे)


त्रुटि - केस 1:

कोड:

- (void)myFunction { 
    Model *model = [Model objectForPrimaryKey:1]; 

    if (model) { 
     [self updateModel:model]; 
    } 
} 

- (void)updateModel:(Model *)model { 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    [manager PUT:@"http://www.example.com" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 

     [[RLMRealm defaultRealm] beginWriteTransaction]; 
     model.updated = YES; // Crash: Object has been deleted or invalidated. 
     [[RLMRealm defaultRealm] commitWriteTransaction]; 

    } failure:nil]; 
} 

त्रुटि - केस 2:

संपत्ति:

@property (strong, nonatomic) Model *model; 

कोड:

- (void)myFunction { 
    Model *model = [Model objectForPrimaryKey:1]; 

    if (model) { 
     self.model = model; 

     UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Would you like to edit the model?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil]; 
     [alert show]; 
    } 
} 

UIAlertView प्रतिनिधि:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     [[RLMRealm defaultRealm] beginWriteTransaction]; 
     self.model.updated = YES; // Crash: Object has been deleted or invalidated. 
     [[RLMRealm defaultRealm] commitWriteTransaction]; 
    } 
} 

धन्यवाद।

उत्तर

7

उदाहरण के लिए 1 नेटवर्क अनुरोध को एक अलग ऑपरेशन कतार पर एसिंक्रोनस निष्पादित किया जाता है और मुख्य थ्रेड पर वापस कॉल किया जाता है, यह संभावना है कि आपके पास कुछ कोड हो, जिसे उपयोगकर्ता कार्रवाई द्वारा ट्रिगर किया जा सके और हटाएं एक साथ वस्तु। आपके द्वारा धारित मॉडल ऑब्जेक्ट संदर्भ स्वचालित रूप से अपडेट हो जाएगा और हटाए जाने को प्रतिबिंबित करेगा। चूंकि हटाए गए ऑब्जेक्ट को संशोधित नहीं किया जा सकता है, यह त्रुटि में आता है।

इसके अलावा उदाहरण 2 में समवर्तीता शामिल है। आपका कोड पहले मॉडल ऑब्जेक्ट को पुनर्प्राप्त करता है, फिर यह अलर्ट व्यू दिखाता है। जबकि UIAlertView दिखाया गया है, मुख्य धागा अवरुद्ध नहीं है। सैद्धांतिक रूप से, एक नेटवर्क ऑपरेशन पहले खत्म हो सकता है, पूरा हो सकता है, पूरा करने के लिए ब्लॉक ब्लॉक भेजा जा सकता है, मॉडल ऑब्जेक्ट का एक विलोपन होता है। उपयोगकर्ता संशोधनों की पुष्टि करता है। प्रतिनिधि के आपके कार्यान्वयन को बुलाया जाता है, लेकिन उम्मीद है कि पहले से पुनर्प्राप्त वस्तु अभी भी मौजूद है।

क्रैश से बचने की एक संभावना एक पूर्ण मॉडल ऑब्जेक्ट संदर्भ के बजाय केवल प्राथमिक कुंजी को स्टोर करना है, जो हालिया परिवर्तनों को अद्यतन और प्रतिबिंबित रखेगी। प्राथमिक कुंजी स्थिर रहेगी और हमेशा आपकी वस्तु की पहचान करने में सक्षम होना चाहिए। फिर आप सीधे अपने लेखन लेनदेन में ऑब्जेक्ट को पुनर्प्राप्त करने के लिए प्राथमिक कुंजी का उपयोग कर सकते हैं।

ध्यान दें कि यदि आपका डेटा समवर्ती रूप से संशोधित किया गया था, तो यह निर्धारित करने के लिए कि यह आपके ऐप कैसे व्यवहार करता है, यह किसी भी मामले में होगा। आप प्रतिलिपि बनाने में अधिक डेटा रखकर ऑब्जेक्ट को फिर से बनाने का प्रयास कर सकते हैं, या ईवेंट को अनदेखा कर सकते हैं और डिलीट जीत सकते हैं, या सुनिश्चित कर सकते हैं कि UI को पर्याप्त रूप से प्रतिबंधित करके विरोधाभासी संशोधन नहीं होंगे। आपको एक संघर्ष समाधान रणनीति के साथ आना होगा।

+0

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

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