1 सवाल: मैं अपना CoreData बैकग्राउंड कॉनटेक्स्ट में सम्मिलित करता हूँ और जब मैं लाता हूँ, यह डेटा नहीं दिखाता है

पर बनाया गया सवाल Tue, Apr 9, 2019 12:00 AM

मैं बैकग्राउंड संदर्भ पर अपना कोर-डेटा ऑपरेशन करने की कोशिश कर रहा हूं। मैं अपना सारा डेटा बैकग्राउंड के संदर्भ में सम्मिलित करता हूं, लेकिन जब मैं मुख्य थ्रेड पर आता हूं, तो यह कोई भी डेटा नहीं दिखाता है, जो मैंने पहले ही डाला था। मुझे नहीं पता, मैं कहाँ गलती कर रहा हूँ ... :( किसी भी मदद की सराहना करते हैं।

यह वह है जिसे मैंने डालने की कोशिश की है और दूसरा डेटा लाने के लिए है।

- (void)insertNameAndSurnameInDataBase:(NSString *)name surname:(NSString *)surname numbers:(NSArray *)numbers labels:(NSArray *)labels {
    AppDelegate *appDel=(AppDelegate *)[UIApplication sharedApplication].delegate;

    NSManagedObjectContext *saveObjectContext = [appDel saveManagedObjectContext];
    NSManagedObjectContext *bgContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];

    bgContext.parentContext = saveObjectContext;

    [bgContext performBlockAndWait:^{
        NSError *error;
        NameAndSurname *nameAndSurname = [NSEntityDescription insertNewObjectForEntityForName:@"NameAndSurname" inManagedObjectContext:bgContext];
        NSString *nSurname = [NSString stringWithFormat:@"%@ %@",name,surname];

        if (nSurname.length == 0) {
            nameAndSurname.nameSurname = [numbers objectAtIndex:0];
        } else {
            nameAndSurname.nameSurname = nSurname;
        }

        if ([bgContext save:&error]) {
        } else {
        }

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"NameAndSurname" inManagedObjectContext:bgContext];

        // predicate
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"nameSurname =[c] %@", nSurname];

        [fetchRequest setEntity:entity];
        [fetchRequest setPredicate:predicate];
        [fetchRequest setReturnsObjectsAsFaults:NO];

        NSArray *fetchedObjects = [bgContext executeFetchRequest:fetchRequest error:&error];
        if([fetchedObjects count] > 0){
            [numbers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
                id obj2 = [labels objectAtIndex:idx];
                obj = [obj stringByReplacingOccurrencesOfString:@" " withString:@""];

                ContactNumber *phoneNumber = [NSEntityDescription insertNewObjectForEntityForName:@"ContactNumber" inManagedObjectContext:bgContext];
                phoneNumber.number = obj;
                phoneNumber.label = obj2;
                phoneNumber.nameAndSurname = fetchedObjects[0];
                NSError *error;
                if ([bgContext save:&error]) {
                } else {
                }
            }];
        }
    }];
}



- (NSArray *)fetchNameAndSurname {
    AppDelegate *appDel = (AppDelegate *)[UIApplication sharedApplication].delegate;
    _managedObjectContext = [appDel managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"NameAndSurname"
                                              inManagedObjectContext:_managedObjectContext];

    [fetchRequest setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"nameSurname" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]]];
    [fetchRequest setEntity:entity];
    [fetchRequest setReturnsObjectsAsFaults:NO];

    NSError *error = nil;
    NSArray *fetchedObjects = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];

    return [fetchedObjects valueForKey:@"nameSurname"];
}


    
1
1 उत्तर                              1                         

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

  • ऐसा प्रतीत होता है कि विधि saveManagedObjectContext आपके मुख्य प्रबंधित ऑब्जेक्ट संदर्भ के लिए एक गेट्टर है। अंग्रेजी में, सेव एक क्रिया है, ताकि इस विधि का नाम यह लगे कि यह कुछ प्रबंधित ऑब्जेक्ट संदर्भ को सहेज रहा है। अगर मैं सही हूं, तो आपको saveManagedObjectContext नाम बदलकर शायद 060035099111101001035062 करना चाहिए।

  • यह कथन 0600350991100100135035062 काफी गैर-मानक है, जो इसके गेटटर प्रतीत होता है से एक उदाहरण चर को निर्दिष्ट करता है। यदि, हमेशा की तरह, mainMangaedObjectContext प्रॉपर्टी है जो _managedObjectContext = [appDel managedObjectContext] को सपोर्ट करता है, इस स्टेटमेंट का कोई प्रभाव नहीं है।

  • अपनी पहली विधि में आप 0600350991100100135035062 का उपयोग करते हैं, और अपनी दूसरी विधि में आप _managedObjectContext का उपयोग करते हैं। ऐसा लगता है कि काम करने के लिए आपके भ्रूण के लिए भी यही संदर्भ होना चाहिए। क्या वो?

अद्यतन:

जैसा कि आपने अपनी टिप्पणी में कहा था, जो बचत को ठीक करता है, लेकिन अब आपके पास एक प्रदर्शन समस्या है - डिस्क पर लगातार स्टोर पर सहेजना उपयोगकर्ता इंटरफ़ेस को अवरुद्ध करता है, जो कि आपका मूल कोड ठीक करने का प्रयास कर रहा है।

यह एक सुलझी हुई समस्या है। समाधान यह है कि आपका मुख्य-थ्रेड संदर्भ, जो उपयोगकर्ता को रोकता है, आपके बैकग्राउंड-थ्रेड संदर्भ का एक बच्चा होना चाहिए जो लगातार स्टोर करने के लिए इंटरफेस करता है। यह इस मार्कस ज़र्रा 2015 ब्लॉग पोस्ट के कोड के साथ अच्छी तरह से समझाया गया है। >। आगे पढ़ने के लिए, Chay Wilken ने थोड़ी भिन्नता प्रकाशित की है । दोनों आपके लिए ऑब्जेक्टिव-सी में लिखे गए हैं:)

    
0
2019-04-10 14: 47: 02Z
  1. Thanks @Jerry Krinock, fetch request (दूसरी विधि) में अगर मैं _managedObjectContext = [appDel प्रबंधितOjectContext] को बदलूं; NSManagedObjectContext * saveObjectContext = [appDel saveManagedObjectContext]; यह काम करता हैं। और अगर मैं दोनों विधि को मुख्य mainMangaedObjectContext में बदलता हूं, तो यह काम करता है .. लेकिन मेरा मुद्दा यह है, मुझे इसे सहेजते समय कोर-डेटा में JSON से कई डेटा को सहेजने की आवश्यकता है, ऐप मुख्य दृश्य तब तक ब्लॉक करना शुरू कर देता है जब तक कि यह खत्म नहीं हो जाता - ऑपरेशन, मैं करने की कोशिश कर रहा हूँ मुख्य धागे को ब्लॉक न करने के लिए पृष्ठभूमि थ्रेड पर यह सभी ऑपरेशन करना है ....
    2019-04-10 08: 14: 03Z
  2. यह सेव मैनेज ऑब्जेक्ट संदर्भ विधि है - (NSManagedObjectContext *) saveManagedObjectContext {if (लेखकManManObjectContext! = nil) {return authorManagedObjectContext! } NSPersistentStoreCoordinator * समन्वयक = [स्वयं स्थाई StoreCoordinator]; if (कोऑर्डिनेटर! = nil) {authorManagedObjectContext = [[NSManagedObjectContext आवंटन] initWithConcurrencyType: NSPStreetQueueConcuteType]; [authorManagedObjectContext setPersistentStoreCoordinator: समन्वयक]; } वापसी लेखक }
    2019-04-10 08: 14: 58Z
  3. स्विफ्ट में, अगर मैं पृष्ठभूमि संदर्भ में उन सभी को बचाना चाहता हूं, तो मैं कुछ इस तरह से कर सकता हूं: managedObjectContext 0600350991100100101035062 लेकिन उद्देश्य से-में ऐसा लगता है कि newBackgroundContext () विधि मौजूद नहीं है।
    2019-04-10 08: 25: 31Z
  4. > अद्यतन देखें: ऊपर मेरे उत्तर में।
    2019-04-10 14: 47: 23Z
  5. धन्यवाद @ जेरी क्रिनोक ..
    2019-04-12 08: 53: 24Z
    [appDel saveManagedObjectContext]
स्रोत रखा गया यहाँ