2012-09-07 54 views
19

जब दो NSURLs की तुलना और एक NSString (जो एक यूआरएल पता) के साथ एक NSURL तुलना मैं हाल ही में एक समस्या थी, स्थिति मैं या यूआरएल पता यह की ओर इशारा पता नहीं हो सकता है मैं कहीं से एक NSURLRequest मिला है, औरदो NSURL या एक NSURL और NSString की तुलना करने के लिए विश्वसनीय तरीका?

[[request.URL.absoluteString lowercaseString] isEqualToString: [self.myAddress lowercaseString]]; 

इस सं रिटर्न: मैं एक यूआरएल NSString, कहते हैं कि "http://m.google.com", अब मैं जांच करने की आवश्यकता है कि NSURLRequest में URL URL स्ट्रिंग मैं था के रूप में ही है क्योंकि absoluteString मुझे "http://m.google.com/" देता है जबकि मेरी स्ट्रिंग अंत में एक स्लैश के बिना "http://m.google.com" होती है, भले ही मैं

[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.google.com"]] 
का उपयोग करके NSURLRequest बनाता हूं

यह अभी भी मुझे "http://m.google.com/" absoluteString के लिए देता है, मुझे आश्चर्य है कि NSURL या एक NSURL और एक NSString की तुलना करने के लिए कोई विश्वसनीय तरीका है?

  1. जांच एक दूसरे के 'शामिल', लेकिन यह विश्वसनीय नहीं है के रूप में 'http://m.google.com/blabla' शामिल 'http://m.google.com' यदि।

  2. एनएसएसटींग को एनएसआरएल में परिवर्तित करें और दो NSRL की तुलना करने के लिए isEqual विधि का उपयोग करें और उम्मीद है कि isEqual के एनएसआरएल के कार्यान्वयन से इसका पता लग सकता है?

  3. चरण 2 के आधार पर है, लेकिन एक मानक यूआरएल standardizedURL उपयोग करने के लिए प्रत्येक NSURL कन्वर्ट?

बहुत बहुत धन्यवाद!

+0

क्या दूसरे एनएसआरएल के अंत में '/' है?यह 'isEqualToString' विधि – Robotnik

+0

को फेंकने के लिए पर्याप्त होगा हाँ, लेकिन जो मैं पूछ रहा हूं वह एक विश्वसनीय तरीका है जो मुझे यह सुनिश्चित करने की अनुमति नहीं देता है कि अंत में '/' है, क्योंकि वास्तविक यूआरएल समान नहीं है इससे कोई फर्क नहीं पड़ता कि आपके पास अंत में '/' नहीं है। – hzxu

+0

नहीं, 'ISEqual:' NSRL' का "इसे समझना" नहीं है :( – dasblinkenlight

उत्तर

28

आप स्लैश अस्पष्टता के बारे में केवल परवाह, तो आप इस सवाल के साथ जल्दी से जानते हुए भी कि NSURL पथ स्लैश ट्रिम द्वारा बांटना सकते हैं।

लेकिन मुझे लगता है कि कुछ मानकों पर आधारित तुल्यता लागू करता NSURL पर एक वर्ग विधि का विचार पसंद ("तुल्यता" शायद इस मामले में समानता तुलना में एक बेहतर शब्द है)।

@RobNapier एक अच्छा जवाब है कि RFC2616 के लिए अंक के साथ एक संबंधित सवाल को दर्शाता है। यूआरएल सिंटैक्स के लिए एक और प्रासंगिक मानक RFC1808 है।

कठिन हिस्सा यह तय करना है कि हम क्या तुल्यता से मतलब है, उदाहरण के लिए, क्या भिन्न प्रश्न या टुकड़े (लंगर लिंक) के बारे में? नीचे दिए गए कोड इन अस्पष्टता के अधिकांश के लिए सहनशीलता के किनारे पर errs ...

// in NSURL+uriEquivalence.m 

- (BOOL)isEquivalent:(NSURL *)aURL { 

    if ([self isEqual:aURL]) return YES; 
    if ([[self scheme] caseInsensitiveCompare:[aURL scheme]] != NSOrderedSame) return NO; 
    if ([[self host] caseInsensitiveCompare:[aURL host]] != NSOrderedSame) return NO; 

    // NSURL path is smart about trimming trailing slashes 
    // note case-sensitivty here 
    if ([[self path] compare:[aURL path]] != NSOrderedSame) return NO; 

    // at this point, we've established that the urls are equivalent according to the rfc 
    // insofar as scheme, host, and paths match 

    // according to rfc2616, port's can weakly match if one is missing and the 
    // other is default for the scheme, but for now, let's insist on an explicit match 
    if ([self port] || [aURL port]) { 
     if (![[self port] isEqual:[aURL port]]) return NO; 
     if (![[self query] isEqual:[aURL query]]) return NO; 
    } 

    // for things like user/pw, fragment, etc., seems sensible to be 
    // permissive about these. 
    return YES; 
} 
+0

इसे एप्लिकेशन संरचना में कहां लागू किया जाना चाहिए? – Ben

+1

@ बेन, उद्देश्य-सी देता है आप वर्गों को जोड़ने (विधियों को जोड़ने) का एक तरीका है। (यहां दस्तावेज़ देखें https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html)। फ़ाइल नामकरण सम्मेलन है ExistingClass + DescriptionOfAddition.h और .m – danh

+2

यह विधि उपयोग करने के लिए वास्तव में सुरक्षित नहीं है। अगर '' 'self.query == nil''' लेकिन aURL.query विधि वापस नहीं है; – melbic

-8

आसान तरीका है:

NSString*urlString=[NSString stringWithFormat:@"%@",request.URL]; 
तो

आप NSString विधि isEqual के साथ तुलना करें:

BOOL equalty=[urlString isEqual:anotherNSString]; 

एक्सडी

+6

यह खराब कोड है। यह - डिस्क्रिप्शन (NSURL) के कार्यान्वयन में निर्भर करता है और यह -इस एक्वाल का उपयोग करता है: इसके बजाय -इस एक्वाल्ट टॉस्ट्रिंग:। इसके अलावा दो "बराबर" यूआरएल विभिन्न विवरण उत्पन्न कर सकते हैं इस प्रकार आपका समाधान टूट जाएगा। "एक्सडी" की कोई ज़रूरत नहीं है। –

+6

'NSURL पूर्ण स्ट्रिंग' इस कार्यान्वयन से बेहतर होगा। – Jessedc

+2

मैं सोच रहा हूं कि मेरी टिप्पणी हटा दी गई है लेकिन मैं टिप्पणी करता हूं कि क्रिस्टियन किएनले और केसेड ने पोस्ट किया। – SyntheticMeshwork

2

मुझे पता है कि इसका उत्तर दिया गया है। लेकिन मुझे नहीं लगता, यह स्पष्ट है।

मैं निम्नलिखित की सिफारिश करना चाहते हैं।

if ([[url1 absoluteString] isEqualToString:[url2 absoluteString]]) 
{ 
    //Add your implementation here 
}