2012-09-06 4 views
5

+[NSURL URLWithString:] Aufruf Ich habe zwei Optionen für meine URLs Gebäude:- [NSString StringByAppendingPathComponent:] oder nur - [NSString StringByAppendingFormat:] für NSStrings für NSURLs? Wenn

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

oder

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

-[NSString stringByAppendingPathComponent:] wie die richtigere Antwort scheint, aber verliere ich alles mit -[NSString stringByAppendingFormat:] neben Umgang mit Doppelschrägstriche als im folgenden Fall?

// 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' wird, in der Theorie, verwenden Sie die "Systempfad-Trennzeichen" gegenüber dem Pfadtrennzeichen, das fest in Ihr Format eingebunden ist, wodurch Ihr Code (etwas mehr) systemunabhängig wird. Aber natürlich wird Objective-C bei Windoze nicht sehr häufig verwendet, daher ist dies kein großes Problem. –

Antwort

3

Wie Sie URLs verwenden sind, sollten Sie die NSURL Methoden verwenden:

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

oder in Swift

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

der Punkt stringByAppendingPathComponent ist doppelte Schrägstriche zu handhaben, können Sie jedoch so etwas wie tun könnte:

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

Wie wäre:

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

Wie in der Come nts a / wird aus dem Protokoll bei Verwendung der Methoden aus NSPathUtitlites.h ausgezogen, so dass der offensichtliche Untergang ist. Die Lösung, die ich mit dem kommen könnte, ist am nächsten an der ursprünglichen ich geschrieben ist:

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

Sie müssen nur eine wörtliche für den Pfad-Separator verwenden, das ist, was NSString does.

NSString stellen Pfade allgemein mit ‚/‘ als Pfadtrenn und ‚‘ als Verlängerung Separator.

+1

Ich bekomme das Strippen der // von der URL: Ausgabe ist http: /example.com/foo/bar, was schlecht ist. Siehe unten. –

3

Ich lief in ein Problem mit stringByAppendingPathComponent: es überall doppelte Schrägstriche entfernt !:

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

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

für eine baseURL von https://blah.com

und eine teilweise von/moreblah

das Produziert zwei Saiten:

2012-09-07 14: 02: 09.724 myapp st Ring1 ist https://blah.com/moreblah

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

Aber aus irgendeinem Grund meiner Anrufe blah.com Ressource Arbeit mit dem einzelnen Schrägstrich zu erhalten . Aber es zeigt mir an, dass stringByAppendingPathComponent für Pfade - NOT URLs ist.

Dies ist auf iPhone 4-Hardware mit iOS 5.1.

Ich gab die UTF8-Strings aus, da ich sicherstellen wollte, dass der Debugger-Output, den ich sah, glaubwürdig war.

Also ich denke, ich sage - verwenden Sie nicht Weg Zeug auf URLs, verwenden Sie etwas Hausgebräu oder eine Bibliothek.

+0

Die doppelten Schrägstriche, die auf einen einzelnen Schrägstrich reduziert werden, sind wahrscheinlich das Ergebnis eines Aufrufs von ['stringByStandardizingPath'] (http://developer.apple.com/library/mac/#documentation/cocoa/Reference/Foundation/Classes/NSString_Class /Reference/NSString.html#//apple_ref/occ/instm/NSString/stringByStandardizingPath) durch die Pfadmethoden, so ist es nicht für URLs. BTW Ich habe meine Antwort aktualisiert, nachdem ich Ihnen geantwortet habe. – Joe

+0

Es mag sein, dass es ein neues Verhalten ist (im letzten Jahr oder so) - ich denke, dass Pfade mit '//' und '..' für ruchlose Aktivitäten benutzt werden können (zB um zu versuchen, irgendwo 'anders' zu gehen) Dateisystem –

+0

@Ashley Mills 'Antwort sieht korrekt aus. –