2015-12-27 7 views
6

मुझे रिश्ते में जोड़े जाने के बाद किसी ऑब्जेक्ट को लाने के साथ कोई समस्या है। पहली बार जब मैं श्रेणी प्राप्त करता हूं, हमेशा पाया जाता है, तो जब मैंने रिश्ते में जोड़ा तो निम्नलिखित श्रेणियां नहीं मिलीं।रिश्ते में जोड़े जाने के बाद कोर्डटा में कोई ऑब्जेक्ट नहीं मिला

संबंध Many-To-Many है।

उदाहरण:

    categoryId = 10
  • मिले श्रेणी वस्तु
  • पैरेंट ऑब्जेक्ट संबंध
  • अगला वस्तु
  • कई श्रेणियों में एक ही id है के लिए जोड़ा गया, categoryId = 10 साथ

  • लायें श्रेणी ,

    नहीं मिला 10
    NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    
        [private setParentContext:self.model.context]; 
        __block NSError *error = nil; 
    
        [private performBlockAndWait:^{ 
    
         GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:private]; 
         for (NSDictionary *dic in responseObject[@"response"]) { 
    
          GPCategory *category; 
    
          //The first time always found 
          if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:private])) { 
           NSLog(@"Found"); 
           [category addDealsObject:deal]; 
    
          } else { 
           NSLog(@"Not Found"); 
    
          } 
    
         } 
        }]; 
    
        NSError *PrivateError = nil; 
        if (![private save:&PrivateError]) { 
         NSLog(@"Unresolved error %@, %@", PrivateError, [PrivateError userInfo]); 
         abort(); 
        } 
    
        if (!error) { 
         //Save on main moc 
         [self.model saveWithErrorBlock:^(BOOL success, NSError *error) { 
          if (!success) { 
           NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]); 
          } 
         }]; 
    
        } else { 
         NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]); 
        } 
    

संपादित करें:

हल, मुझे लगता है मेरी समस्या यह थी कि मैं प्रत्येक यात्रा के अंत में मुख्य संदर्भ बचाने के लिए भूल गया था।

 NSManagedObjectContext *backgroundMOC = [self.model backgroundMOC:self.model.context]; 

     [backgroundMOC performBlockAndWait:^{ 

      for (NSDictionary *dic in responseObject[@"response"]) { 

       GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:backgroundMOC]; 

       GPCategory *category; 
       if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:backgroundMOC])) { 
        NSLog(@"Found with mainAttribute %@", dic[@"mainAttribute"]); 
        [deal addDealCategoryObject:category]; 
       } 

       if([backgroundMOC hasChanges]) { 
        NSError * error; 
        [backgroundMOC save:&error]; 

        [self.model.context performBlockAndWait:^{ 
         if([self.model.context hasChanges]) { 
          NSError * error; 
          [self.model.context save:&error]; 
         } 
        }]; 
       } 
      } 
     }]; 
+0

'सौदा' वस्तु का कौन सा संदर्भ संबंधित है? ऐसा लगता है कि यह 'निजी' से एक अलग संदर्भ होना चाहिए। आपको विभिन्न संदर्भों में वस्तुओं के बीच संबंध स्थापित नहीं करना चाहिए। प्रबंधित ऑब्जेक्ट आईडी पास करें और फिर 'objectWithID' का उपयोग करके इसे' निजी 'संदर्भ में पुनर्प्राप्त करें। – pbasdf

+0

मैंने पहले ही चेक किया है, लेकिन निजी संदर्भ – brunobasas

+0

के अंदर 'सौदा' बनाया गया है, इसलिए आपकी समस्या केवल caregoryId = 10 के साथ है? पहली बार आपके पास 10 में डिक है [@ "mainAttribute"] यह श्रेणी ढूंढता है और दूसरी बार ऐसा नहीं करता है? तथ्य यह है कि समस्या MR_findFirstByAttribute से नहीं आ रही है, मुझे बताती है कि समस्या डिक [@ "mainAttribute"] में पूर्णांक वाली स्ट्रिंग हो सकती है। क्या आप यह जांचने के लिए एनएसएलओजी (@ "आईडी: -% @ -") देख सकते हैं कि आईडी में पहले या बाद में रिक्त स्थान नहीं हैं? – Mikael

उत्तर

1

आप एमओसी श्रृंखला को बचाने में कमी कर सकते हैं। स्पष्टता के लिए, मैंने कीवर्ड private को परिवर्तनीय नाम backgroundMOC के साथ बदल दिया है।

ऊपर सवाल पर, मैं केवल यह मान सकते हैं कि लाइन NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; तकनीकी रूप से के समान है:

- (NSManagedObjectContext *)backgroundMOC:(NSManagedObjectContext *)mainMOC 
{ 
    NSManagedObjectContext * threadManagedObjectContext = [[NSManagedObjectContext alloc] 
          initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    [threadManagedObjectContext setParentContext:mainMOC]; 
    [threadManagedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; 
    return threadManagedObjectContext; 
} 

mainMOC रूप self.model.context गुजर, एक self.model.context और एक setMergePolicy साथ।
इसी तरह, मुझे लगता है चाहिए कि self.model saveWithErrorBlock तकनीकी रूप से करने के लिए समान होता है:

[mainMOC performBlockAndWait:^{ 
    if([mainMOC hasChanges]) { 
     NSError * error; 
     [mainMOC save:&error]; 
     // handle error 
    } 
}]; 

यदि हां, तो एक ही backgroundMOC (अपने private संदर्भ) के बारे में कहा जाना चाहिए:

[backgroundMOC performBlockAndWait:^{ 
    if([backgroundMOC hasChanges]) { 
     NSError * error; 
     [backgroundMOC save:&error]; 
     // handle error 
    } 
}]; 

अन्य में शब्द, आप यह सुनिश्चित करना चाहते हैं कि और mainMOC सहेजें ऑपरेशन performBlockAndWait के साथ अपने संबंधित धागे से निष्पादित किया गया है।

+0

क्या आप अपना आखिरी पोस्ट अपडेट देख सकते हैं? वास्तव में – brunobasas

+0

की सराहना करते हैं चिंता का वह थ्रेड है जिसमें से आप 'self.model.context save' के लिए' performBlockAndWait' निष्पादित करते हैं '। यह मुख्य धागे पर किया जाना चाहिए, या फिर आपका 'यूआई' (कहें कि आप 'NSFetchedResultsController' का उपयोग कर रहे हैं) क्रैश कर सकते हैं (http://stackoverflow.com/a/6913811/218152 देखें)। साथ ही, यदि आपको '[मुख्य एमओसी सेव: & error]' हर बार जब आप 'पृष्ठभूमि एमओसी सेव करें: और त्रुटि]' की आवश्यकता होती है, तो आपको पहले स्थान पर 'backgroundMOC'' की आवश्यकता नहीं हो सकती है: 'backgroundMOC' का विचार लंबा संचालन करना है , जो यहां मामला नहीं हो सकता है। अधिक जानकारी: http://stackoverflow.com/search?q=user%3A218152+performBlockAndWait – SwiftArchitect

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