2013-09-04 11 views
6

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

इस article के मुताबिक बच्चे के संदर्भ सेटअप यूआई को उत्तरदायी रखने में मदद नहीं करते हैं, जबकि नेट पर हर जगह मैंने पढ़ा है, अगर आप भारी प्रसंस्करण से मुख्य कतार को छुटकारा दिलाना चाहते हैं तो यह तरीका है? क्या मैं कुछ भूल रहा हूँ ?

NSManagedObjectContext *mainMOC = self.mainObjectContext; 
    NSManagedObjectContext *backgroundMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

    [backgroundMOC setParentContext:mainMOC]; 
    [backgroundMOC performBlock:^{ 

     //query for objects 
     NSArray *results = [Product MR_findAllInContext:backgroundMOC]; 

      NSError *childError = nil; 
      [backgroundMOC save:&childError]; 

     if ([results count] > 0) { 
      //get objectIDs 
      NSMutableArray *objectIDs = [NSMutableArray array] 
      for (NSManagedObject *object in results) { 
      [objectIDs addObject:[object objectID]]; 
      } 

      [mainMOC performBlock:^{ 
       //refetch objects on the mainQueue 
       NSMutableArray *persons = [NSMutableArray array] 
       for (NSManagedObjectID *objectID in objectIDs) { 
       [persons addObject:(Person*)[mainMOC objectWithID:objectID]]; 
       } 
       //return result 
       if (self.callBack) 
       self.callBack(persons); 
      }]; 
     } 
    }]; 
+1

मेरा सुझाव है कि आप डब्ल्यूडब्ल्यूडीसी 2013 वीडियो "कोर डेटा प्रदर्शन अनुकूलन और डिबगिंग" देखें जो इस सामान के बारे में बात करता है। –

+0

अगर ऐसा है, तो आईओएस 5 पर एक बग था, जहां यूएस को फ्रीज किया गया था, जहां मुख्य संदर्भ को एनएसएफटेड रीसेट्स कंट्रोलर द्वारा समर्थित किया गया था, इसे देखें [कोर डेटा नेस्टेड प्रबंधित ऑब्जेक्ट संदर्भ और लगातार डेडलॉक्स-फ्रीज] (http : //stackoverflow.com/questions/11786436/core-data-nested-managed-object-contexts-and-frequent-deadlocks-freezes) – Leonardo

+0

यदि आपका कोड मुख्य संदर्भ पर एक बच्चे के संदर्भ का उपयोग करके बुलाया जाता है और एक प्रदर्शनब्लॉक बेकार है , कृपया सुनिश्चित करें कि आपके पेस्ट किए गए कोड को मुख्य थ्रेड –

उत्तर

13

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

आप वर्तमान दृष्टिकोण हैं जो घोंसला वाले संदर्भों के काम के बारे में एक व्यापक व्यापक गलतफहमी है।

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

पृष्ठभूमि संदर्भ को सहेजने से ऑब्जेक्ट ग्राफ़ में मुख्य संदर्भ में सभी परिवर्तनों को धक्का दिया जाएगा, जिसके बाद परिवर्तनों को जारी रखने के लिए भी सहेजना होगा। पृष्ठभूमि संदर्भ पर एक फ़ेच अनुरोध करने से इसे मुख्य संदर्भ में अग्रेषित किया जाएगा, जो इसे लगातार स्टोर समन्वयक को भेज देगा और परिणाम को पृष्ठभूमि संदर्भ सिंक्रनाइज़ पर परिणाम देगा। पृष्ठभूमि संदर्भ (fetch या save) पर कोई भी अनुरोध पैरेंट संदर्भ को लॉक करेगा और मुख्य थ्रेड को मुख्य रूप से मुख्य संदर्भ पर अनुरोध करते समय मुख्य थ्रेड को अवरुद्ध करेगा।

मुख्य धागे संदर्भ के पीछे पृष्ठभूमि संदर्भ जोड़ना प्रदर्शन के अनुसार उड़ान भरने वाला नहीं है। नेस्टेड संदर्भों को इस तरह से उपयोग नहीं किया जाता है।

आप जो चाहते हैं उसे प्राप्त करने के लिए, आपको एक संदर्भ पर fetch अनुरोध करना होगा जो मुख्य संदर्भ से स्वतंत्र है, उदा। एक पृष्ठभूमि संदर्भ जो सीधे पीएससी से जुड़ा हुआ है। इस मामले में fetch अनुरोध अभी भी पीएससी लॉक होगा। इसका अर्थ यह है कि इस समय के दौरान मुख्य संदर्भ पर अनुरोध निष्पादित करने से पीएससी पर लॉक विवाद की वजह से मुख्य धागा अवरुद्ध हो जाएगा। लेकिन कम से कम मुख्य धागा सामान्य रूप से अवरुद्ध नहीं किया जाएगा।

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

+0

मैं आपको सबकुछ दे रहा हूं। –

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