2012-12-19 28 views
8

मुझे इस मूल डेटा त्रुटि के साथ एक वास्तविक समय है।कोर डेटा + 'कथन अभी भी सक्रिय है'

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:  'statement is still active' 

मेरा ऐप और कोड सभी कभी-कभी जब अनुरोध बहुत जल्दी बुला छोड़कर ठीक काम करता है। ऐसा तब होता है जब मैं ऐप तोड़ने की कोशिश कर रहा हूं। एक स्क्रीन से अगले तक जा रहा है, डेटा डाउनलोड कर रहा है और fetch अनुरोध निष्पादित कर रहा है।

मुझे पता है कि इसमें थ्रेडिंग और कोर डेटा के साथ कुछ करना है।

मैं अपने स्वयं के प्रबंधित ऑब्जेक्ट संदर्भ के साथ, पृष्ठभूमि थ्रेड से कोड का यह टुकड़ा बुला रहा हूं।

+ (AN_User *)updateWithRecord:(NSDictionary *)record moc:(NSManagedObjectContext *)moc{ 

    NSNumber *userID = nil; 
    NSString *username = nil; 

    if([record objectForKey:@"user_id"]){ 
     userID = [NSNumber numberWithInt:[[record objectForKey:@"user_id"] intValue]]; 
    }else if([record objectForKey:@"id_member"]){ 
     userID = [NSNumber numberWithInt:[[record objectForKey:@"id_member"] intValue]]; 
    } 

    if([record objectForKey:@"username"]){ 
     username = [NSString stringWithFormat:@"%@", [record objectForKey:@"username"]]; 
    }else if([record objectForKey:@"member_name"]){ 
     username = [NSString stringWithFormat:@"%@", [record objectForKey:@"member_name"]]; 
    } 

    if(!userID||!username){ 
     return nil; 
    } 

    __block AN_User *user = nil; 

    [moc performBlockAndWait:^{ 

     NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 

     NSEntityDescription *entity = [NSEntityDescription entityForName:@"AN_User" inManagedObjectContext:moc]; 
     [request setEntity:entity]; 

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(user_id == %@) OR (username == %@)", userID, username]; 
     [request setPredicate:predicate]; 

     if([moc countForFetchRequest:request error:nil]==0){ 
      user = (AN_User *)[NSEntityDescription insertNewObjectForEntityForName:@"AN_User" inManagedObjectContext:moc]; 
     }else{ 
      NSArray *fetchResults = [moc executeFetchRequest:request error:nil]; 
      if(fetchResults.count>0){ 
       user = [fetchResults objectAtIndex:0]; 
      } 
     } 

     if(user){ 

      user.user_id = userID; 
      user.username = username.lowercaseString; 

      //Parse profile image url 
      NSString *avatar = [record objectForKey:@"avatar"]; 
      NSString *fileName = [record objectForKey:@"filename"]; 
      if([avatar isKindOfClass:[NSString class]]&&avatar.length>0){ 
       user.profile_image_url = [NSString stringWithFormat:@"%@", avatar]; 
      }else if([fileName isKindOfClass:[NSString class]]&&fileName.length>0){ 
       user.profile_image_url = [NSString stringWithFormat:@"http://www.example.com/forum/avs/%@", fileName]; 
      } 

      if([record objectForKey:@"gpbp_respect"]){ 
       user.respect = [NSNumber numberWithFloat:[[record objectForKey:@"gpbp_respect"] floatValue]]; 
      } 

     } 
    }]; 
    return user; 
} 

मैं समझता हूँ कि यह सिर्फ इस से बताने के लिए शायद कठिन है, लेकिन किसी को भी मुझे बता सकते हैं अगर मैंने कुछ गलत कर रहा हूँ, इन अनुरोधों के, कि तुरंत स्पष्ट है।

+0

[अपवाद ब्रेकपॉइंट जोड़ें] (http://stackoverflow.com/questions/4961770/run-stop-on-objective-c-exception-in-xcode-4)। फिर से त्रुटि ट्रिगर करें। डीबग नेविगेटर से स्टैक ट्रेस कॉपी करें और इसे अपने प्रश्न में पेस्ट करें। –

+0

धन्यवाद। मैंने ऐसा करने की कोशिश की लेकिन मैं त्रुटि को दोहराना नहीं कर सका। मुझे लगता है कि मैंने इसे ठीक कर दिया है। –

उत्तर

6

यदि आप किसी तालिका को स्क्रॉल करते हैं जो बी/जी थ्रेड पर कोर डेटा कहता है, तो ऐसा होता है और कोर डेटा को एक थ्रेड पर संदर्भ होने की उम्मीद है।

एक अन्य एसओ पोस्टर ने प्रति थ्रेड एमओसीएन्टेक्स्ट बनाकर इसके आसपास काम किया, लेकिन मुझे कई धागे पर सीआरयूडी के विचार पसंद नहीं हैं इसलिए मैंने अपने कोड के चारों ओर एक डिस्पैच_एसिंक (dispatch_get_main_queue(),) रैपिंग फ़ंक्शन डाला है। अब तक कोई दुर्घटना नहीं है, लेकिन यह दुर्लभ है इसलिए मैं इस पर बिल्कुल निश्चित नहीं हूं।

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