2012-09-07 8 views
19

Vor kurzem habe ich ein Problem, wenn zwei NSURLs zu vergleichen und ein NSURL mit einem NSString vergleichen (die eine URL-Adresse ist), ist die Situation, die ich von irgendwo einen NSURLRequest bekam, kann ich oder nicht die URL-Adresse weiß, kann es zu den Punkten, und ich habe eine URL NSString, sagen Sie „http://m.google.com“, jetzt muss ich überprüfen, ob die URL in diesem NSURLRequest die gleiche wie die URL-Zeichenfolge, die ich hatte:Zuverlässige Möglichkeit, zwei NSURL oder eine NSURL und eine NSString zu vergleichen?

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

dieses NO zurückgibt wie die absoluteString gibt mir "http://m.google.com/" wo meine Zeichenfolge ist "http://m.google.com" ohne Schrägstrich am Ende, auch wenn ich den NSURLRequest erstellen mit

[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.google.com"]] 

es gibt mir noch „http://m.google.com/“ für absoluteString, frage ich mich, ist es eine zuverlässige Art und Weise zu NSURL oder ein NSURL und ein NSString zu vergleichen?

  1. prüfen, ob eine andere ‚enthält‘, aber das ist nicht zuverlässig, wie ‚http://m.google.com/blabla‘ enthält ‚http://m.google.com‘.

  2. wandeln den NSString zu NSURL und verwenden Sie die isEqual Methode zwei NSURL zu vergleichen und hoffentlich NSURL Implementierung von isEqual kann es herausfinden?

  3. basierend auf Schritt 2, aber konvertieren Sie jede NSURL zu einer Standard-URL mit standardizedURL?

Vielen Dank!

+0

hat die zweite NSURL ein '/' am Ende davon?das wäre genug, um die 'isEqualToString'-Methode loszuwerden. – Robotnik

+0

Ja, aber was ich verlange, ist ein zuverlässiger Weg, der es mir nicht erlaubt, sicherzustellen, dass es ein '/' am Ende gibt, da die tatsächliche URL die gleiche ist Egal, ob du ein '/' am Ende hast oder nicht. – hzxu

+0

Nein, 'isEqual:' von 'NSURL' findet es nicht" heraus :( – dasblinkenlight

Antwort

28

Wenn Sie nur über den Schrägstrich Mehrdeutigkeit kümmern, können Sie mit dieser Frage verzichtet werden schnell durch das Wissen, dass NSURL Pfad des Schrägstrich trimmt.

Aber ich mag die Idee einer Kategorie-Methode auf NSURL, die einige Standards-basierte Äquivalenz implementiert ("Äquivalenz" ist wahrscheinlich ein besserer Begriff als Gleichheit in diesem Fall).

@RobNapier bezieht sich auf eine Frage im Zusammenhang mit einer guten Antwort, die RFC2616 Punkte. Ein weiterer relevanter Standard für die URL-Syntax ist RFC1808.

Der schwierige Teil ist zu entscheiden, was wir unter Äquivalenz verstehen, zum Beispiel was ist mit abweichenden Abfragen oder Fragmenten (Anker-Links)? Der Code irrt unten auf der Seite der Permissivität für die meisten dieser Mehrdeutigkeiten ...

// 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

Wo sollte dies in der Anwendungsstruktur implementiert werden? – Ben

+1

@Ben, objective-c gibt Sie können Klassen erweitern (Methoden hinzufügen). (Siehe doc hier https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html). Die Dateinamenskonvention ist ExistingClass + DescriptionOfAddition.h und .m – danh

+2

Diese Methode ist nicht wirklich sicher zu verwenden Wenn '' 'self.query == nil''', aber aURL.query ist nicht die Methode gibt YES zurück; – melbic

-8

Einfache Möglichkeit ist:

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

, so dass Sie mit NSString Methode isEqual vergleichen:

BOOL equalty=[urlString isEqual:anotherNSString]; 

XD

+6

Das ist schlechter Code. Es hängt von der Implementierung von -description (NSURL) ab und verwendet -isEqual: anstelle von -isEqualToString :. Außerdem können zwei "gleiche" URLs unterschiedliche Beschreibungen ergeben, so dass Ihre Lösung durchbrochen wird. Keine Notwendigkeit zu "XD". –

+6

'NSURL absoluteString' wäre besser als diese Implementierung. – Jessedc

+2

Ich denke, löschen Sie meinen Kommentar, aber ich ratter nehme die Kommentare, die Cristian Kienle und Kessec gepostet haben. – SyntheticMeshwork

2

ich weiß, das wird beantwortet. Aber ich denke nicht, es ist klar.

Ich möchte das folgende empfehlen.

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