iphone cocoa cocoa-touch macos nsstring

iphone - StringByAppendingPathComponent de NSString: elimina un ''/'' en http://



cocoa cocoa-touch (6)

URLByAppendingPathComponent

Desde iOS 4, URLByAppendingPathComponent está disponible en iOS y maneja las dos barras diagonales correctamente. (OS X lo tenía desde 10.6., Como señala Chuck)

myURL = [myURL URLByAppendingPathComponent:@"hello world"] // http://foo/bar/hello%20world

Tenga en cuenta que, a diferencia de stringByAppendingPathComponent , este método escapa al argumento.

URLWithString: relativeToURL:

Alternativamente, hay URLWithString:relativeToURL: que no se escapa. Entonces, si el componente url ya se ha escapado, use:

myURL = [NSURL URLWithString:@"hello%20world" relativeToURL:myURL] // http://foo/bar/hello%20world

Tenga en cuenta que myURL debe terminar con una barra inclinada aquí y que el segmento agregado no debe tener una barra inclinada inicial.

He estado modificando algunos códigos para que funcionen entre Mac OS X y iPhone OS.

Encontré un código que estaba usando el NSURL de URLByAppendingPathComponent: (agregado en 10.6), que como algunos saben, no está disponible en el iPhone SDK.

Mi solución para hacer que este código funcione entre sistemas operativos es usar

NSString *urlString = [myURL absoluteString]; urlString = [urlString stringByAppendingPathComponent:@"helloworld"]; myURL = [NSURL urlWithString:urlString];

El problema con esto es que el NSString de stringByAppendingPathComponent: parece eliminar uno de los / ''s de la parte http: // de la URL.

¿Es este un comportamiento intencionado o un error?

Editar

Ok, así que fui un poco demasiado rápido al hacer la pregunta anterior. Volví a leer la documentación y dice:

Tenga en cuenta que este método solo funciona con rutas de archivos (no, por ejemplo, representaciones de cadenas de URL)

Sin embargo, no proporciona ningún indicador en la dirección correcta sobre qué hacer si necesita agregar un componente de ruta a una URL en el iPhone ...

Siempre podía hacerlo manualmente, agregando un / si fuera necesario y la cadena adicional, pero estaba buscando mantenerlo lo más cerca posible del código original de Mac OS X ...


Hay un trabajo simple alrededor. El uso de [NSString stringWithFormat: @ "% @ /% @", servidor, archivo] funciona bien.

Ej .: servidor: ftp://www.server.com y archivo: archivo.txt



La referencia NSString dice esto acerca de stringByAppendingPathComponent:

Tenga en cuenta que este método solo funciona con rutas de archivos (no, por ejemplo, representaciones de cadenas de URL).

Entonces, creo que es un caso de "No hagas eso".

Utilice -stringByAppendingString: lugar?


Yo implementaría un método myURLByAppendingPathComponent: en NSURL que hace lo mismo. La razón para darle un nombre diferente es que no anula el método provisto por Apple cuando Apple se acerca a la conversión de la API 10.6 al iPhone (de modo que "mi" es solo un ejemplo; el punto es que es poco probable que alguien de lo contrario escribiría un método con ese nombre).

Me parece que solo quieres meterte con la ruta en lugar de con la URL completa. Aquí hay un ejemplo no probado:

- (NSURL *)myURLByAppendingPathComponent:(NSString *)component { NSString *newPath = [[self path] stringByAppendingPathComponent:component]; return [[[NSURL alloc] initWithScheme: [self scheme] host: [self host] path: newPath] autorelease]; }

Solo funcionaría correctamente con URL que tengan rutas similares a archivos, pero estoy bastante seguro de que el método de Apple funciona de la misma manera. En cualquier caso, espero que te ayude en la dirección correcta.


+ (NSString *)urlStringPathWithComponents:(NSArray *)paths { NSString *url = @""; for( NSString *item in paths) { if([item isEqualToString:paths.firstObject]) { url = [url stringByAppendingString:[NSString stringWithFormat:@"%@", item]]; }else{ url = [url stringByAppendingString:[NSString stringWithFormat:@"/%@", item]]; } } return url; }

Como puede ver, el código anterior es un método de clase y este permiso se puede usar en cualquier lugar sin una instancia de un objeto.

Nota: Siempre el primer objeto de la matriz debe ser una url base.