2011-01-09 17 views
8

उच्च और निम्न इस के लिए खोज कर दिया गया:कोर डाटा: बीच में क्रियान्वित NSFetchRequest

कोर डाटा में, वहाँ बाधित करने के लिए/रोक/रद्द करने और NSFetchRequest को क्रियान्वित करने के लिए एक रास्ता है?

मैं एक आईफोन ऐप में एक वृद्धिशील खोज को कार्यान्वित कर रहा हूं, और मैंने इसे अनुकूलित करने के हर तरीके की कोशिश की है, लेकिन यह पर्याप्त नहीं है (मेरे पास 42,000 रिकॉर्ड हैं), इसलिए मुझे इसे एनएसओपरेशन में चलाने की ज़रूरत है। जब कोई नया अक्षर टाइप किया जाता है, तो मुझे पिछले fetchRequest को रद्द करने की आवश्यकता होती है, लेकिन [nsoperation रद्द करें] कुछ भी नहीं करता है।

एक और दृष्टिकोण उस क्षेत्र को स्थानांतरित करने के लिए हो सकता है जिसे मैं किसी अन्य इंटरप्टिबल इंडेक्स में खोज रहा हूं, शायद मेमोरी में, या शायद एक अलग sqlite3 डेटाबेस, जो sqlite_interrupt के साथ अंतःक्रियात्मक प्रतीत होता है।

उत्तर

2

मेरा समाधान क्वेरी संचालन जारी रखने देना था, लेकिन यह जांचने के लिए कि क्या UI को अपडेट करने के लिए ईवेंट भेजने से पहले उन्हें रद्द कर दिया गया था या नहीं।

यह सही नहीं है क्योंकि आपके पास अभी भी बहुत से क्वेरी ऑपरेशन चल रहे हैं, जिसके परिणाम कभी भी उपयोग नहीं किए जाएंगे, लेकिन यह अभी भी थोड़ा तेज़ है।

2

संक्षिप्त उत्तर - नहीं, सीधे नहीं, क्षमा करें।

लांग जवाब - हां, लेकिन आप काफ़ी करते हैं या ऐसा करने के लिए काम करना है यह

आप एक पृष्ठभूमि सूत्र में इसे चलाने के लिए (जो यह आप की तरह लगता है पहले से ही NSOperation के माध्यम से कर रहे हैं) की आवश्यकता होगी

अपने fetch में, एक समय में 20 परिणाम प्राप्त करने के लिए सीमा निर्धारित करें और इसे एक लूप में चलाएं। प्रत्येक बार लूप के माध्यम से, परिणाम को एक सरणी में जोड़ें। प्रत्येक बार जब fetch परिणामों के प्रत्येक सेट हो जाता है, तो यह देखने के लिए जांचें कि क्या आप अनुरोध रद्द करना चाहते हैं।

+2

उत्तरार्द्ध काम नहीं करता है क्योंकि आदेशित क्वेरी के लिए, पहले 20 के रूप में पहले 20 को प्राप्त करने में लगभग उतना समय लगता है। – mclin

1

मुझे वास्तव में आपके जैसा ही समस्या थी। इसे हल करने के लिए मैं performSelector:afterDelay: विधि

यह थोड़ा मुश्किल है, लेकिन जब उपयोगकर्ता तेज़ी से 3 अक्षरों को तेज़ी से टाइप करता है तो मैं 3 अनुरोध नहीं भेजना चाहता हूं, लेकिन जब उपयोगकर्ता टाइपिंग समाप्त करता है तो केवल एक ही। मैंने 0.5 या उससे अधिक की छोटी देरी निर्धारित की है।

और इस कोड का उपयोग करें:

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 
[self performSelector:@selector(fetchSearch:) withObject:searchQuery afterDelay:0.5]; 

तो उपयोगकर्ता प्रकार तेजी से, यह पिछले अनुरोधों को कैंसिल कर और केवल पिछले एक भेज देंगे।

14

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

बेहतर प्रश्न: आप प्रत्येक चरित्र के लिए एक नया fetch क्यों कर रहे हैं?

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

  • पहला वर्ण
  • डिस्क मारो ही अगर एक चरित्र खोज बॉक्स
  • पहले से लोड होने पर विचार करें से हटा दिया जाता है पर केवल डिस्क मारो:

    जब एक खोज क्षेत्र लागू करने निम्नलिखित विकल्पों पर विचार करें डिस्क हिट से बचने के लिए ऑब्जेक्ट आईडी और खोजने योग्य संपत्ति।

जो आप खोज रहे हैं उसके आधार पर (और खोज में सुधार के लिए कोर डेटा स्टोर को पुनर्निर्मित करने के तरीके हैं) आप स्मृति में थोड़ा सा प्रीलोड कर सकते हैं। यहां तक ​​कि 42 के रिकॉर्ड के साथ यदि खोज गुण पर्याप्त छोटे हैं तो आप उन्हें सभी को स्मृति में लोड कर सकते हैं।

संभावना है कि उपयोगकर्ता को उस उपयोग के मामले की जांच करने की आवश्यकता है, भले ही उपयोगकर्ता "ए" दबाकर शुरू होता है।

NSFetchRequest का कोई हिस्सा धीमा है? SQLite डेटाबेस को मारना या डेटा को स्मृति में लोड करना? आपके उत्तर के आधार पर आप सीधे खोज प्रदर्शन में सुधार कर सकते हैं।

+0

शानदार, धन्यवाद! – JOM

+0

यदि आपको खोज टेक्स्ट में कोई वर्ण डाला गया तो आपको "डिस्क दबाएं" भी चाहिए। उदाहरण के लिए कोई उपयोगकर्ता "fooar" टाइप कर सकता है और उसके बाद गायब चरित्र को डालने से इसे सही कर सकता है और फिर अगली खोज "foobar" होगी। – Sean

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