2012-06-22 16 views
7

मैं एक fetch अनुरोध निष्पादित कर रहा हूं जो 2000 इकाइयों को लौटाता है। वर्तमान में, यह मेरे डिवाइस पर लगभग 20 सेकंड लेता है। इसलिए मैंने सोचा कि मैं 100 की एक लांच सीमा निर्धारित कर सकता हूं, और फिर जब उपयोगकर्ता तालिका दृश्य के अंत तक स्क्रॉल करता है, तो अगली 100 इकाइयां प्राप्त करें। इसे NSFetchRequest'ssetFetchLimit और setFetchOffset का उपयोग करके पूरा किया जा सकता है।बैचिंग कोर डेटा फ़ेच परिणाम

हालांकि, मुझे क्या पता नहीं लगा सकता है, अगर मेरे दूसरे fetch पर जहां मैं वस्तुओं को 101-200 ला रहा हूं, तो वस्तुओं 1-100 के साथ क्या होगा? क्या मुझे प्रत्येक 100 आइटमों के लिए अलग NSFetchedResultsController का उपयोग करना होगा, और उसके बाद एकाधिक तालिका परिणाम नियंत्रकों के आधार पर क्वेरी करने के लिए मेरी तालिका दृश्य डेटा स्रोत विधियों को कॉन्फ़िगर करना होगा? या क्या मैं किसी भी तरह से एक ही समय में 100 इकाइयों को लाने के लिए NSFetchedResultsController का उपयोग कर सकता हूं, लेकिन प्रत्येक आगामी fetch पर, अगले 100 आइटम मूल 100 आइटम में जोड़ें?

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

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"MessageObject" inManagedObjectContext:appDelegate.managedObjectContext]; 

    [fetchRequest setEntity:entity]; 
    NSPredicate *predicate= [NSPredicate predicateWithFormat:@"ANY tags.tagName==%@", currentTagObject.tagName]; 
    [fetchRequest setPredicate:predicate]; 
    NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 
    [fetchRequest setFetchBatchSize:5]; 
+0

क्या आप अपना अनुरोध प्राप्त करने का अनुरोध दिखा सकते हैं? जहां तक ​​मुझे पता है, परिणाम नियंत्रक प्राप्त किए गए हैं (और मुझे लगता है कि सरल fetch अनुरोध भी) आपके लिए ऐसा करने में दोषपूर्ण उपयोग करते हैं। यह संभव है कि आपकी "क्वेरी" को अनुकूलित किया जा सके। –

+0

मैंने अपना कुछ कोड पोस्ट किया है। मुझे समझ में नहीं आता - फिर संस्थाओं को लाने में 20 सेकंड क्यों लगते हैं? जब मैं 100 की सीमा निर्धारित करता हूं, तो यह 1 सेकंड में आता है, लेकिन बिना सीमा के, जो 2000 इकाइयों को लाता है, इसमें 20 सेकंड लगते हैं। – Snowman

उत्तर

2

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

+0

तब इकाइयों को लाने में 20 सेकंड लगते हैं? जब मैं 100 की सीमा निर्धारित करता हूं, तो यह 1 सेकंड में आता है, लेकिन बिना सीमा के, जो 2000 इकाइयों को लाता है, इसमें 20 सेकंड लगते हैं। – Snowman

+0

ठीक है, यह अभी भी आपके द्वारा निर्दिष्ट आकार के आधार पर प्राप्त करता है। 100 लाने के लिए 2000 लाने से तेज़ है। अपने fetchRequest पर, बैच आकार को 50 या 100 पर सेट करें। यही वह है। इसके लिए और कुछ नहीं है। आपके सभी रिकॉर्ड आवश्यकतानुसार लोड करना जारी रखेंगे, क्योंकि कोरडाटा बाद के आवश्यक fetches और दोषों को संभालता है। – isaac

+0

लेकिन इसलिए यह समाधान नहीं है - मुझे 20 सेकंड प्रतीक्षा को खत्म करने की आवश्यकता है, और बैच आकार को सेट करने में कोई फर्क नहीं पड़ता है। इसके अलावा, अजीब बात यह है कि मैंने बैच आकार को 2000 में सेट किया है, और इसे बैच आकार की तुलना में 9 सेकंड में लाया गया, जिसमें 20 सेकंड लग गए। उसके साथ क्या है? – Snowman

3

किसी भी का उपयोग करना एक महंगा महंगा ऑपरेशन है। मुझे रिश्तों के बारे में निश्चित नहीं है, लेकिन आप अपनी टैग इकाई को अपने मेसेज ऑब्जेक्ट इकाई के बजाय विशिष्ट टैग नाम के लिए लाने का प्रयास कर सकते हैं। फिर संदेश ऑब्जेक्ट इकाइयों को प्राप्त करने के लिए व्यस्त रिश्ते का उपयोग करें

इसके अलावा आपका सॉर्ट एक तुलनित्र का उपयोग कर रहा है जो मुझे यकीन है कि मामलों की मदद नहीं कर रहा है। तारीख को कोर डेटा द्वारा एक पूर्णांक संख्या के रूप में संग्रहीत किया जाना चाहिए ताकि आप चयनकर्ता का उपयोग किए बिना सीधे सीधा प्रकार कर सकें।

कोर डेटा बहुत तेज है, मैंने 65,000 रिकॉर्ड के माध्यम से एक खोजशब्द खोज की है और परिणाम मिलीसेकंड में लौटा चुके हैं।

अच्छा ल्यूक

+0

हालांकि यह सब सच है, यह वास्तव में प्रश्न का उत्तर नहीं देता .... – lnafziger

+3

यह सही दिशा में लोगों को मार्गदर्शन करने के बारे में कभी जवाब नहीं है। – Snowman

+0

@tim वास्तव में एक अच्छा विचार है, एकल टैग ऑब्जेक्ट को पुनर्प्राप्त करने और संदेश सेट प्राप्त करने के बारे में। बहुत तेज होगा। हालांकि, मैं इसे NSFetchedResultsController तक कैसे जोड़ सकता हूं? यदि किसी टैग में 2000 ऑब्जेक्ट्स हैं, तो मैं उन्हें एक बार में स्मृति में लोड नहीं करना चाहता हूं। एक fetch परिणाम नियंत्रक के साथ, उनमें से केवल कुछ मुट्ठी किसी भी समय स्मृति में लोड किया जाएगा .. – Snowman