2009-11-11 11 views
17

मैं एक NSFetchController में मक्खी पर छंटाई बदलने के लिए, सेगमेंट में बंटे नियंत्रण के कुछ प्रकार से कोशिश कर रहा हूँ पर एक NSFetchedResultsController में छंटाई बदल रहा है। या तो ए-> जेड जेड-> एक प्रकार की चीज़ को सॉर्ट करने के लिए।मक्खी

क्या मेरे पास हैं यह करने के लिए करना है? मैं जेफ लेमार्क के उदाहरण यहाँ अनुसरण कर रहा हूं: Here

मैं एक नया NSFetchedResultsController और फिर सेट यह करने की जरूरत है, या मैं बस एक नई NSFetchRequest बनाने के लिए और

fetchedResultController.fetchRequest = newFetchRequest 

करते हैं और फिर मेरी तालिका स्वचालित रूप से होगा क्या करते हो अद्यतन करें?

उत्तर

31

मैं एक ही समस्या से फंस गया था और मैं इसे FetchRequestController के FetchRequest पर सॉर्ट डिस्क्रिप्टर सेट करने के साथ ठीक कर सकता हूं, फिर एक fetch (performFetch) निष्पादित कर सकता हूं और अंत में तालिका दृश्य पर डेटा पुनः लोड कर सकता हूं।

NSArray *sortDescriptors = [NSArray arrayWithObject: sorter]; 
[[fetchedResultsController fetchRequest] setSortDescriptors:sortDescriptors]; 
NSError *error; 
if (![[self fetchedResultsController] performFetch:&error]) { 
     // Handle you error here 
} 
[sorter release]; 
[myTableView reloadData]; 

यह मैं एफआरसी छोड़ने के बिना मक्खी पर छंटाई परिवर्तन से निपटने या किसी अन्य फैंसी वस्तु हैंडलिंग करने के लिए सबसे आसान तरीका था। मुझे उस पर प्रदर्शन के प्रभाव के बारे में निश्चित नहीं है और यदि तालिका में पंक्तियों का सेट विशाल है तो इसका असर हो सकता है।

+0

मैंने आपके समाधान का उपयोग किया। ऐसा लगता है कि कोई अंतराल नहीं है। लेकिन क्या किसी शरीर को पता है कि यह डेटाबेस से भौतिक fetch करेगा? – user523234

+1

ध्यान रखें कि सॉर्ट डिस्क्रिप्टर को तत्काल एफआरसी के fetchRequest पर बदलना एक नकारात्मक है। प्रतिनिधि विधि 'नियंत्रक का उपयोग करते समय: didChangeObject: atIndexPath: forChangeType: newIndexPath:' एफआरसी ऑब्जेक्ट्स पर बदली गई विशेषता 'के रूप में ऑब्जेक्ट पर बदली गई विशेषता को' अपडेटेड 'के बजाय' स्थानांतरित 'के रूप में रिपोर्ट करती है,' ऑब्जेक्ट पर बदली गई विशेषता एक प्रकार के वर्णनकर्ताओं में से एक है अनुरोध प्राप्त करें '। एफआरसी केवल उस तत्कालता पर उस कीपैथ को ध्यान में रखता है, इसलिए जब आप बाद में अन्य कीपैथ में सॉर्ट डिस्क्रिप्टर बदलते हैं, तो एफआरसी इसे ध्यान में रखेगा और 'चाल' या इसके विपरीत 'अपडेट' की रिपोर्ट करेगा। बेहतर एफआरसी बनाओ। – bteapot

2

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

+7

हालांकि आप NSFetchedResultsController की fetchRequest प्रॉपर्टी को प्रतिस्थापित नहीं कर सकते हैं (यह केवल पढ़ा जाता है), आप fetchRequest के गुणों को बदल सकते हैं और फिर से प्राप्त कर सकते हैं। यह आपको NSFetchedResultsController को फिर से बनाने से बचाता है। –

+0

क्या कोई नया NSFetchedResultsController बनाये बिना सेक्शननामपैथ को बदलने की कोई संभावना है? – ComSubVie

+0

'sectionNameKeyPath' एक पठनीय संपत्ति है, इसलिए मुझे लगता है कि आपको एक नया' NSFetchedResultsController' बनाना होगा। – Alex

8

अपने NSFetchedResultsController को अपनी तालिका दृश्य डेटा स्रोत के रूप में उपयोग करने के बजाय, एक एनएसएआरएआरई बनाएं जिसे आपने सेट किया है जब उपयोगकर्ता आपके सेगमेंट किए गए नियंत्रण के साथ सॉर्ट ऑर्डर बदलता है, जो प्राप्त परिणामों पर सरणी सामग्री के आधार पर होता है। फिर मानक सरणी सॉर्टिंग का उपयोग करके बस क्रमबद्ध करें। कुछ इस तरह:

- (IBAction)segmentChanged:(id)sender 
{ 
    // Determine which segment is selected and then set this 
    // variable accordingly 
    BOOL ascending = ([sender selectedSegmentIndex] == 0); 

    NSArray *allObjects = [fetchedResultsController fetchedObjects]; 

    NSSortDescriptor *sortNameDescriptor = 
         [[[NSSortDescriptor alloc] initWithKey:@"name" 
           ascending:ascending] autorelease]; 

    NSArray *sortDescriptors = [[[NSArray alloc] 
        initWithObjects:sortNameDescriptor, nil] autorelease]; 

    // items is a synthesized ivar that we use as the table view 
    // data source. 
    [self setItems:[allObjects sortedArrayUsingDescriptors:sortDescriptors]]; 

    // Tell the tableview to reload. 
    [itemsTableView reloadData];  
} 

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

- (NSInteger)tableView:(UITableView*)tableView 
numberOfRowsInSection:(NSInteger)section 
{ 
    return [items count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Get your table cell by reuse identifier as usual and then grab one of 
    // your records based on the index path 
    // ... 

    MyManagedObject *object = [items objectAtIndex:[indexPath row]]; 

    // Set your cell label text or whatever you want 
    // with one of the managed object's fields. 
    // ... 

    return cell; 
} 

अगर यह सबसे अच्छा तरीका है, लेकिन यह काम करना चाहिए सुनिश्चित नहीं हैं।

+0

यह विधि वास्तव में अच्छी तरह से काम करता है। धन्यवाद मैट। – Dimitris

+1

एक समयपूर्व अनुकूलक होने के जोखिम पर: क्या यह तत्वों की एक निश्चित संख्या के बाद व्यावहारिक होना बंद कर देगा? अगर अनुक्रमित किया गया है, तो डीबी सॉर्टिंग में अधिक कुशल होगा। – TimCinel

+0

यह भी बहुत उपयोगी होता है जब किसी को एक क्षणिक संपत्ति (जिसे NSFetchedResultsController नहीं करेगा) पर सॉर्ट करने की आवश्यकता होती है – RunLoop

3

एंड्रियास शेफ़र जवाब मेरे लिए काम किया।

[[fetchedResultsController fetchRequest] setSortDescriptors:sortDescriptors]; 

या

[[fetchedResultsController fetchRequest] setPredicate:predicate]; 

इस कॉल करने से पहले: चाल है कि क्या यह इस कोड के साथ अनुरोध लाने के लिए एक नया पैरामीटर स्थापित कर रही है

if (![[self fetchedResultsController] performFetch:&error]) { 
     // Handle you error here 
} 

[self.tableView reloadData]; 

ऐसा लगता है कि आप निर्धारित करते NSFetchedResultsController की तुलना में एक नया पैरामीटर आपके द्वारा सेट किए गए सेट के आधार पर एक नया fetchrequest करेगा .. नया पैरामीटर सेट किए बिना, यह फिर से प्राप्त नहीं करेगा और केवलपर कॉल करेगायह काम नहीं करेगा ..

उम्मीद है कि यह किसी और की मदद करेगा ..

+1

धन्यवाद, यह मेरे लिए पूरी तरह से काम किया। Upvoted .. – NSPratik

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