2012-09-06 21 views
5

Al llamar +[NSURL URLWithString:] que tienen dos opciones para construir mis URL:- [NSString stringByAppendingPathComponent:] o simplemente - [NSString stringByAppendingFormat:] para NSStrings para NSURLs?

[[@"http://example.com" stringByAppendingPathComponent:@"foo"] stringByAppendingPathComponent:@"bar"] 

o

[@"http://example.com" stringByAppendingFormat:@"/%@/%@",@"foo",@"bar"]; 

-[NSString stringByAppendingPathComponent:] parece la respuesta más correcta, pero no pierdo nada usando -[NSString stringByAppendingFormat:] además de la manipulación dobles barras como en el siguiente caso?

// http://example.com/foo/bar 
[[@"http://example.com/" stringByAppendingPathComponent:@"/foo"] stringByAppendingPathComponent:@"bar"] 

// http://example.com//foo/bar oops! 
[@"http://example.com/" stringByAppendingFormat:@"/%@/%@",@"foo",@"bar"]; 
+0

'stringByAppendingPathComponent' será, en teoría, utilizar el "separador de ruta del sistema" frente al separador de ruta conectado a su formato, lo que hace que su código (un poco más) sea independiente del sistema. Pero, por supuesto, Objective-C no se utiliza con mucha frecuencia en Windoze, por lo que este no es un gran problema. –

Respuesta

3

A medida que progresa con URL, debe utilizar los métodos NSURL:

NSURL * url = [NSURL URLWithString: @"http://example.com"]; 
url = [[url URLByAppendingPathComponent:@"foo"] URLByAppendingPathComponent:@"bar"] 

o en Swift

var url = NSURL.URLWithString("http://example.com") 
url = url.URLByAppendingPathComponent("foo").URLByAppendingPathComponent(".bar") 
0

el punto de stringByAppendingPathComponent es manejar dobles barras, sin embargo, usted podría hacer algo como:

[[@"http://example.com/" stringByAppendingPathComponent:[NSString stringWithFormat:@"%@/%@", @"foo", @"bar"]] 
1

¿Qué tal:

[pathWithComponents NSString: @ [@ "http : //example.com ", @" foo ", @" bar "]]

Como se indicó en el comme nts a / se elimina del protocolo al usar los métodos de NSPathUtitlites.h, por lo que es la caída obvia. La solución que podía llegar a que es la más cercana a la original que he publicado es:

[@[ @"http://example.com", @"foo", @"bar" ] componentsJoinedByString:@"/"] 

Usted sólo tendrá que utilizar un literal para el separador de ruta que es lo NSString does.

NSString representa caminos genéricamente con ‘/’ como el camino separador y ‘’ como separador de extensión.

+1

Obtengo esto eliminando // de la URL: el resultado es http: /example.com/foo/bar, lo cual es malo. Vea abajo. –

3

Me acabo de encontrar con un problema con stringByAppendingPathComponent: elimina dobles barras por todas partes !:

NSString* string1 = [[self baseURL] stringByAppendingString:partial]; 
NSString* string2 = [[self baseURL] stringByAppendingPathComponent:partial]; 

NSLog(@"string1 is %s", [string1 UTF8String]); 
NSLog(@"string2 is %s", [string2 UTF8String]); 

para un baseurl de https://blah.com

y un parcial de/moreblah

Produce la dos cadenas:

2012-09-07 14: 02: 09.724 miapp st RING1 es https://blah.com/moreblah

2012-09-07 14: 02: 09,749 miaplicacion string2 es https: /blah.com/moreblah

pero por alguna razón mis llamadas a blah.com para conseguir el trabajo de recursos con la sola barra . Pero me indica que stringByAppendingPathComponent es para rutas, NO URL.

Esto es en el hardware del iPhone 4 con iOS 5.1.

He imprimido las cadenas UTF8 porque quería asegurarme de que la salida del depurador que estaba viendo era creíble.

Así que supongo que estoy diciendo: no use material de ruta en las URL, use algo de cerveza casera o una biblioteca.

+0

Las barras diagonales dobles que se reducen a una sola barra es probablemente el resultado de una llamada a ['stringByStandardizingPath'] (http://developer.apple.com/library/mac/#documentation/cocoa/Reference/Foundation/Classes/NSString_Class /Reference/NSString.html#//apple_ref/occ/instm/NSString/stringByStandardizingPath) por los métodos de ruta, por lo que no es para URL. Por cierto, actualicé mi respuesta justo después de responderle. – Joe

+0

Puede ser que sea un nuevo comportamiento (en el último año más o menos) - Creo que las rutas con '//' y '..' se pueden usar para actividades nefastas (por ejemplo, para intentar ir a algún lugar 'diferente' en el sistema de archivos. –

+0

La respuesta de @Ashley Mills parece correcta. –