2009-06-24 15 views
2

Mit URLs spielen und sie inkrementell von anderen, erkannten URLs erstellen. In diesem Fall würde ich lieber NSURL-Objekte verwenden, anstatt NSStrings zu manipulieren, nur um die zusätzlichen Plausibilitätsprüfungen und URL-spezifischen Methoden aus der URL-Klasse zu erhalten.NSURL analog zu CFURLCreateCopyAppendingPathComponent?

Leider scheint es, dass es keine Möglichkeit gibt, folgendes zu erhalten miteinander zu verbinden, wie ich wünsche:

 
NSURL *base = [NSURL URLWithString:@"http://my.url/path"]; 
NSString *suffix = @"sub/path"; 

Ich möchte, dass sie anhängen erhalten:

http://my.url/path/sub/path

Aber das Beste kann ich scheinen zu erhalten, ist:

 
NSURL *final = [NSURL URLWithString:suffix relativeToURL:base]; 

der den Weg auf der Basis trimmt weg, was zu:

http://my.url/sub/path

Es gibt eine Funktion, die Corefoundation es tut:

 
CFURLRef CFURLCreateCopyAppendingPathComponent (
    CFAllocatorRef allocator, 
    CFURLRef url, 
    CFStringRef pathComponent, 
    Boolean isDirectory 
); 

Welche gut zu funktionieren scheint, aber vor/zurück von ObjC C Prellen ist schrill und ärgerlich ... Ich würde lieber nur Strings manipulieren ... Fehle ich etwas? Anders als natürlich viel zu wählerisch. :)

Antwort

5

Dies ist Ziel C - wenn NSURL nicht das tut, was Sie brauchen, fügen Sie eine Erweiterungskategorie hinzu.

@interface NSURL (Extensions) 
- (NSURL*) urlByAppendingPathComponent: (NSString*) component; 
@end 

@implementation NSURL (Extensions) 
- (NSURL*) urlByAppendingPathComponent: (NSString*) component; 
{ 
    CFURLRef newURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorDefault, (CFURLRef)[self absoluteURL], (CFStringRef)component, [component hasSuffix:@"/"]); 
    return [NSMakeCollectable(newURL) autorelease]; 
} 
@end 

und dann:

*base = [NSURL URLWithString:@"http://my.url/path"]; 
*suffix = @"sub/path"; 
NSURL *final = [base urlByAppendingPathComponent:suffix]; 
NSLog(@"%@", final); 
// displays http://my.url/path/sub/path 
+1

Eine Sache, auf die Sie achten sollten, ist, wie CoreFoundation relative URLs behandelt (sowohl mit -baseURL als auch -relativeString). Sie möchten wahrscheinlich (CFURLRef) [self absoluteURL] stattdessen tun. –

+0

Schön, das wird funktionieren. Vielen Dank. –

+0

Guter Vorschlag Mike, machte ich die Anpassung –

1

Sie könnten die URL in einen String, hängen Sie Ihre relative Komponente konvertieren, dann ist es zu einer URL konvertieren zurück:

NSURL *base = [NSURL URLWithString:@"http://my.url/path"]; 
NSString *suffix = @"/sub/path"; //Note that you need the initial forward slash 

NSString *newURLString = [[base absoluteString] stringByAppendingString:suffix]; 
NSURL *newURL = [NSURL URLWithString:newURLString];

Randbemerkung: Wenn die URL zu einer Datei passiert sein (nicht in Ihrem anfänglichen Beispiel, aber es kann an einem Punkt helfen), können Sie NSString stringByAppendingPathComponent: Methode auch verwenden - dies isoliert Sie von der Auswahl der richtigen Trennzeichen für Ihre Basis und relative Pfade.

+3

Dies ist eine ziemlich schlechte Idee, wie Sie die Verarbeitung von handhaben müßten Schrägstriche genau richtig. Plus eine URL mit allem nach dem Pfad (Query String etc.) wäre schrecklich gemangelt. –

2

Ab iOS 4.0 stellt die NSURL Klasse eine URLByAppendingPathComponent: Methode.

+0

Besser spät als nie. –

1

Ich reparierte diese durch den Schrägstrich von dem Kopf der relativen URL zum Ende der Basis-URL zu bewegen, wie folgt aus:

NSURL *base = [NSURL URLWithString:@"http://my.url/path/"]; //added a slash to the end 
NSString *suffix = @"sub/path"; //seems you don't have the leading slash in your sub path so you don't have to change this line 
+0

Vielen Dank dafür! :) –

+0

Ich bin froh, dass es geholfen hat, bitte upvote es für mich, wenn Sie denken, dass es eine gute Antwort ist, so dass andere es eher sehen –