2010-04-15 18 views
6

बस सोच क्या एक NSPredicate निर्माण करने के लिए सबसे अच्छा तरीका है अगर कुछ फिल्टर वैकल्पिक हैं?एक फिल्टर के लिए एक NSPredicate बिल्डिंग

यह एक फिल्टर के लिए मूल रूप से है, इसलिए यदि कुछ विकल्पों का चयन नहीं कर रहे हैं मैं उन्हें

जैसे द्वारा फिल्टर करने के लिए नहीं है। अगर मेरे पास विकल्प के लिए विकल्प 1 और विकल्प 2 सेट है।

NSPredicate * विधेय = [NSPredicate predicateWithFormat: @ "OPTION1 =% @ और OPTION2 =% @] ....

अन्यथा यदि बस OPTION1 NSPredicate * विधेय = [NSPredicate predicateWithFormat: @" OPTION1 =% @] ....

कुंजी किया जा रहा है वहाँ 10 विभिन्न विकल्पों फिल्टर करने के लिए कर रहे हैं, इसलिए मैं 10x10 संभव संयोजनों के लिए कोड करने के लिए नहीं करना चाहती।

धन्यवाद

उत्तर

17

जॉन के पास (एक NSMutableString, आदि के लिए संलग्न करने के लिए एक के लिए लूप का प्रयोग करके) स्ट्रिंग का निर्माण होता है, इमारत पर एक नजर है और बनाए रखने " टेम्पलेट्स के रूप में उप-विधेय "और फिर अपने तर्क शाखाओं का उपयोग एक यौगिक विधेय के निर्माण के लिए छानने

/* Retain these predicate templates as properties or static variables */ 
NSPredicate *optionOneTemplate = [NSPredicate predicateWithFormat:@"option1 = $OPTVALUE"]; 
// .. and so on for other options 

NSMutableArray *subPredicates = [NSMutableArray arrayWithCapacity:10]; 

/* add to subPredicates by substituting the current filter value in for the placeholder */ 
if (!!optionOneValue) { 
    [subPredicates addObject:[optionOneTemplate predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:optionOneValue forKey:@"OPTVALUE"]]]; 
} 
// .. and so on for other option values 

/* use the compound predicate to combine them */ 
NSPredicate *filterPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates]; 

// Now use your filterPredicate 

प्रदर्शन करने के लिए आप एक शब्दकोश का उपयोग करने के लिए अच्छा और संगठित विधेय टेम्पलेट्स के सेट रखने के लिए चाहते हो सकता है, लेकिन ऊपर के उदाहरण बुनियादी कदम दिखाता है।

रोब।

+0

क्या आप अनुमानित टेम्पलेट को स्थैतिक चर में रखने के तरीके के बारे में अपने विचार पर और अधिक विकसित कर सकते हैं? –

1

predicateWithFormat: एक NSString लेता है। तो तुम सब करने की है विकल्प का चयन नहीं पर आधारित है और यह predicateWithFormat:

+1

सुनिश्चित नहीं हैं कि thats पूरी तरह से सच यह काम करता है: [fetchRequest setPredicate: [NSPredicate predicateWithFormat: @ "STARTTIME> =% @", से]]; यह दुर्घटनाओं: [fetchRequest setPredicate: [NSPredicate predicateWithFormat: [NSString stringWithFormat: @ "STARTTIME> =% @",]] से]; – John

+0

जॉन: ऐसा इसलिए है क्योंकि आपने 'stringWithFormat: 'जोड़ा। ऐसा मत करो। इसके बजाय डायडेरिक ने क्या सुझाव दिया है (या 'घटक जोइनबॉइडिंग:' का उपयोग करें, जो आपके लिए लूप करता है)। –

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