2012-09-06 14 views
5

Quando si chiama +[NSURL URLWithString:] ho due opzioni per costruire il mio URL:- [NSString stringByAppendingPathComponent:] o solo - [NSString stringByAppendingFormat:] per NSStrings per NSURL?

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

o

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

-[NSString stringByAppendingPathComponent:] sembra la risposta più corretta, ma non perdo nulla usando -[NSString stringByAppendingFormat:] oltre movimentazione doppie barre come nel seguente 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' sarà, in teoria, utilizzare il "separatore del percorso di sistema" rispetto al separatore di percorso cablato nel tuo formato, rendendo il tuo codice (leggermente più) indipendente dal sistema. Ma ovviamente, Objective-C non è molto usato su Windoze, quindi non è un grosso problema. –

risposta

3

Come si lavora con gli URL, è necessario utilizzare i metodi NSURL:

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

o a Swift

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

il punto di stringByAppendingPathComponent è quello di gestire le doppie barre, tuttavia, si potrebbe fare qualcosa di simile:

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

ne dite:

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

Come indicato nella comme nts a / viene rimosso dal protocollo quando si utilizzano i metodi da NSPathUtitlites.h, quindi questa è l'ovvia caduta. La soluzione che ho potuto venire con che è più vicina a quella originale che ho postato è:

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

avrete solo bisogno di utilizzare un valore letterale per il separatore di percorso, che è quello che NSString does.

NSString rappresenta percorsi genericamente con ‘/’ come il percorso separatore e ‘’ come separatore estensione.

+1

Ottengo questo stripping // dall'URL: l'output è http: /example.com/foo/bar, che è male. Vedi sotto. –

3

Ho appena incontrato un problema con stringByAppendingPathComponent: rimuove le doppie barre ovunque !:

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

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

per un baseurl di https://blah.com

e un parziale di/moreblah

produce il due stringhe:

2012-09-07 14: 02: 09,724 myapp st ring1 è https://blah.com/moreblah

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

ma per qualche ragione le mie chiamate a blah.com per ottenere il lavoro delle risorse con la singola barra . Ma mi indica che stringByAppendingPathComponent è per i percorsi - NON URL.

Questo è su hardware iPhone 4 con iOS 5.1.

Ho emesso le stringhe UTF8 perché volevo assicurarmi che l'output del debugger che stavo vedendo fosse credibile.

Quindi, suppongo di dire: non utilizzare il percorso sugli URL, utilizzare un po 'di birra fatta in casa o una libreria.

+0

Le doppie barre ridotte a una singola barra sono probabilmente il risultato di una chiamata a ['stringByStandardizingPath'] (http://developer.apple.com/library/mac/#documentation/cocoa/Reference/Foundation/Classes/NSString_Class /Reference/NSString.html#//apple_ref/occ/instm/NSString/stringByStandardizingPath) con i metodi del percorso, quindi non è per gli URL. A proposito ho aggiornato la mia risposta subito dopo che ti ho risposto. – Joe

+0

Può darsi che sia un comportamento nuovo (nell'ultimo anno o giù di lì) - Penso che i percorsi con "//" e ".." possano essere usati per attività nefande (ad esempio per cercare di andare da qualche parte "diversi" nel file system. –

+0

La risposta di @Ashley Mills sembra corretta. –