7

मेरे पास आईओएस कोर डेटा डेटाबेस में इकाई ऑब्जेक्ट्स का एक सेट है जो किसी स्थान पर कुछ वर्णन करता है। आइए इकाई स्थान को कॉल करें। मैंने इसे स्थान पर दो विशेषताओं के साथ कार्यान्वित किया है जो स्थान - अक्षांश और देशांतर दोनों युगल का संदर्भ देता है। नाम जैसे अन्य तत्व भी हैं।NS डेटा में स्थान NSFetchedResultsController के माध्यम से दूरी से क्रमबद्ध?

मैं इकाइयों को एक UITableViewController से बांधने के लिए एक NSFetchedResultsController का उपयोग कर रहा हूं। मैं जो करना चाहता हूं उसके पास दिए गए CLLocationCoordinate2D की दूरी से क्रमबद्ध परिणाम हैं। वास्तव में एक आदर्श परिदृश्य में, मैं उस सूची को नए स्थान के आधार पर क्रमबद्ध करने के लिए रीफ्रेश करने में सक्षम हूं। इसलिए, यह प्रकार दो चाबियों पर निर्भर करेगा, और एक तिहाई "स्थैतिक" चर (जो संग्रह में वस्तुओं में भिन्न नहीं होता है) पर निर्भर करेगा।

मुझे लगता है कि अगर मैं एनएसएसोर्ट डिस्क्रिप्टर के साथ मनमानी सूची को सॉर्ट कर रहा हूं तो मुझे यह पता लगाना चाहिए कि यह कैसे किया जाए। हालांकि, मैं यह नियंत्रित नहीं करता कि कैसे NSSEetchedResultsController में सॉर्ट डिस्क्रिप्टर का उपयोग किया जाता है।

क्या ऐसा कोई तरीका है कि मैं इसे पूरा करने के लिए अपनी संस्थाओं, मेरे NSFetchedResultsController, मेरे NSSortDescriptors आदि को कॉन्फ़िगर कर सकता हूं? मुझे संदेह है कि इसका जवाब एक फैंसी एनएसएसओर्टस्क्रिप्टर बनाने में नहीं है बल्कि इसके बजाय उस दूरी में एक क्षणिक विशेषता बनाने में है जो दूरी-से-मेरे का प्रतिनिधित्व करता है, और समय-समय पर उस विशेषता को पुन: गणना करता है। हालांकि, मैं कोर डेटा के लिए काफी नया हूं कि मुझे यकीन नहीं है कि यह कैसे करना है (सभी इकाइयों पर पुनरावृत्ति करें और एक क्षेत्र को दोबारा शुरू करें)। मुझे यह भी यकीन नहीं है कि क्या NSSortDescriptors क्षणिक विशेषताओं पर काम करेंगे।

+0

दुर्भाग्य से, एक प्राप्त परिणाम नियंत्रक क्षणिक विशेषताओं या गणना गुणों पर सॉर्ट नहीं कर सकता है। Http://stackoverflow.com/questions/13292582/nspredicate-with-function-not-working या http://stackoverflow.com/questions/12027769/nssortdescriptor-sort-by- इसी तरह के मुद्दों और संदर्भों के संदर्भों को देखें प्रलेखन। –

+0

धन्यवाद! मैंने उसे देखा, और इसलिए मैंने सोचा कि उत्तर मेरी कोर डेटा इकाइयों में मूल्यों की गणना में हो सकता है। आइए टेबल से ट्रांजिएंट लें - यदि यह एक क्षणिक क्षेत्र नहीं है, तो मैं समय-समय पर संस्थाओं के सेट को अपडेट करने के बारे में कैसे जाउंगा? –

+0

क्या आपको वास्तव में एक प्राप्त परिणाम नियंत्रक की आवश्यकता है? यदि आप ऑब्जेक्ट को सरणी में लाते हैं तो आप उस सरणी को स्मृति में सॉर्ट कर सकते हैं और तालिका दृश्य के लिए डेटा स्रोत के रूप में उपयोग कर सकते हैं। –

उत्तर

12

(टिप्पणियों से :)

एक लाने एक (आधारित SQLite) कोर डाटा स्टोर तरह उपयोग नहीं कर सकते के लिए अनुरोध क्षणिक विशेषताओं या ऑब्जेक्टिव-सी आधारित विधेय के आधार पर वर्णनकर्ता।

यदि आप किसी प्राप्त परिणाम नियंत्रक के फायदे को खोना नहीं चाहते हैं (जैसे एनिमेटेड टेबल व्यू अपडेट, अनुभागों में स्वचालित समूहकरण आदि) तो आपको वर्तमान स्थान की दूरी को पूर्व-गणना करना होगा और उसे स्टोर करना होगा (लगातार) अपनी वस्तुओं का गुण।

वैकल्पिक रूप से, आप सभी ऑब्जेक्ट्स ला सकते हैं और उन्हें स्मृति में सॉर्ट कर सकते हैं। उस स्थिति में आप मनमाने ढंग से क्रम वर्णनकर्ताओं का उपयोग कर सकते हैं। लेकिन इसे एक प्राप्त परिणाम नियंत्रक के साथ जोड़ा नहीं जा सकता है, इसलिए आपको प्रबंधित ऑब्जेक्ट संदर्भ में परिवर्तनों के लिए पंजीकरण करना होगा और यदि आवश्यक हो तो तालिका को फिर से लोड करना होगा।

0

मैं BSFetchedResultsController github project एक NSFetchResultsController उपवर्ग कि क्या मार्टिन में सुझाव दिया है कि यह एक मनमाना प्रकार वर्णनकर्ता का उपयोग कर, इसके अलावा यह भी संदर्भ में परिवर्तन के लिए पंजीकरण करता स्मृति में सॉर्ट करता है और किसी भी सूचकांक परिवर्तन की गणना करता है खाता मनमाना में फिर से ले जा रहा है कि पता चला सॉर्ट डिस्क्रिप्टर। सब कुछ एक बहुत ही प्रभावशाली कामयाब में! मैं इसे सफलतापूर्वक इस्तेमाल किया दूरी के अनुसार क्रमबद्ध करने के लिए इस प्रकार है:

BSFetchedResultsController* fetchedResultsController = [[BSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 

// create a location to compare distance to, e.g. current location 
CLLocation* sourceLocation = [[CLLocation alloc] initWithLatitude:55.87595153937809 longitude:-4.2578177698913855]; 

// compare the distance from both to the source location 
fetchedResultsController.postFetchComparator= ^(id a, id b) { 
    Venue* v1 = (Venue*)a; 
    Venue* v2 = (Venue*)b; 

    double d1 = [v1.coreLocation distanceFromLocation:sourceLocation]; 
    double d2 = [v2.coreLocation distanceFromLocation:sourceLocation]; 

    return [@(d1) compare:@(d2)]; 
}; 

NSError *error = nil; 
if (![fetchedResultsController performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
} 

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

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

अंत में, यह इस परियोजना समस्या का समाधान और केवल अपने आप का जवाब पोस्ट करने के लिए उसे कारण, निर्माता डेनियल थोर्प के Stackoverflow प्रश्न अनुत्तरित जा रहा की वजह से हो सकता है के लिए आया था प्रकट होता है, तो आप अपनी परियोजना उपयोगी तुम कृपया up-vote his post सकता है पाते हैं मुझे लगता है कि जैसा मैंने किया।

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