2012-09-07 24 views
19

Recientemente tuve un problema cuando comparé dos NSURL y comparé un NSURL con un NSString (que es una dirección URL), la situación es que obtuve una NSURLRequest de alguna parte, puedo o no saber la dirección URL a la que apunta, y tengo una URL NSString, diga "http://m.google.com", ahora tengo que comprobar si la dirección URL en que NSURLRequest es la misma que la cadena de URL que tenía:¿Forma confiable de comparar dos NSURL o un NSURL y un NSString?

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

esto no devolvió como el absoluteString me da "http://m.google.com/" mientras que mi cadena es "http://m.google.com" sin una barra al final, incluso si creo el NSURLRequest usando

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

todavía me da "http://m.google.com/" para absoluteString, me pregunto si hay alguna manera confiable de comparar NSURL o un NSURL y un NSString?

  1. cheque si esta 'contiene' otra, pero esto no es fiable como 'http://m.google.com/blabla' contiene 'http://m.google.com'.

  2. convertir el NSString a NSURL y utilizar el método isEqual para comparar dos NSURL y es de esperar ejecución de isEqual de NSURL puede averiguarlo?

  3. según el paso 2, pero convierta cada NSURL en una URL estándar utilizando standardizedURL?

¡Muchas gracias!

+0

¿El segundo NSURL tiene un '/' al final?eso sería suficiente para tirar el método 'isEqualToString' – Robotnik

+0

Sí, pero lo que estoy pidiendo es una manera confiable que me permite no tener que asegurarme de que haya un '/' en ese momento, ya que la URL real es la misma no importa si tienes o no un '/' al final. – hzxu

+0

No, 'isEqual:' del 'NSURL' no lo" resuelve ":( – dasblinkenlight

Respuesta

28

Si solo le preocupa la ambigüedad de barra inclinada, puede prescindir rápidamente de esta pregunta al saber que la ruta de NSURL recorta la barra inclinada final.

Pero me gusta la idea de un método de categoría en NSURL que implemente una equivalencia basada en estándares ("equivalencia" es probablemente un término mejor que la igualdad en este caso).

@RobNapier se refiere a una pregunta relacionada con una buena respuesta que apunta a RFC2616. Otro estándar relevante para la sintaxis de url es RFC1808.

La parte difícil es decidir qué queremos decir con equivalencia, por ejemplo, ¿qué pasa con las consultas o fragmentos que difieren (enlaces de anclaje)? El código siguiente se equivoca en el lado de la permisividad para la mayoría de estas ambigüedades ...

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

¿Dónde debe implementarse esto en la estructura de la aplicación? – Ben

+1

@Ben, objetivo-c da es una manera de extender (agregar métodos a) las clases. (Consulte el documento aquí https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html). La convención de nomenclatura de archivos es ExistingClass + DescriptionOfAddition.h y .m – danh

+2

Este método no es realmente seguro de usar. Si '' 'self.query == nil''' pero aURL.query no es el método, devuelve SÍ; – melbic

-8

Una forma sencilla es:

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

por lo que comparar con el método NSString IsEqual:

BOOL equalty=[urlString isEqual:anotherNSString]; 

XD

+6

Este es un código incorrecto. Depende de la implementación de -description (NSURL) y usa -isEqual: en lugar de -isEqualToString :. Además, dos URL "iguales" pueden arrojar descripciones diferentes, por lo que su solución se romperá. No es necesario "XD". –

+6

'NSURL absoluteString' sería mejor que esta implementación. – Jessedc

+2

Estoy pensando en borrar mi comentario, pero me gustaría tomar los comentarios que Cristian Kienle y Kessedc publicaron. – SyntheticMeshwork

2

Sé que esto se responde. Pero no creo, es claro.

Me gustaría recomendar lo siguiente.

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