2009-06-24 8 views
2

Jouer avec des URL, en les construisant de manière incrémentielle à partir d'autres URL découvertes. Ce faisant, je voudrais continuer à utiliser des objets NSURL au lieu de manipuler NSStrings, juste pour obtenir les vérifications supplémentaires et les méthodes spécifiques à l'URL de la classe d'URL.NSURL analogique à CFURLCreateCopyAppendingPathComponent?

Malheureusement, il semble qu'il n'y a pas moyen d'obtenir ce qui suit pour se joindre ensemble comment je souhaite:

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

Je veux les joindre pour obtenir:

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

Mais le mieux que je puisse paraître pour obtenir est:

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

qui trims hors du chemin sur la base, ce qui:

http://my.url/sub/path

Il y a une fonction CoreFoundation qui le fait:

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

Ce qui semble fonctionner très bien, mais rebondir avant/arrière de ObjC à C est discordante et ennuyeux ... Je préfère tout simplement des cordes ... manipule Est-ce que je manque quelque chose? Autre que d'être trop difficile, bien sûr. :)

Répondre

5

Ceci est l'objectif C - si NSURL ne fait pas ce dont vous avez besoin, ajoutez une catégorie d'extension.

@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 

puis:

*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

Une chose à surveiller est de savoir comment CoreFoundation gère les URL relatives (celles avec à la fois un -baseURL et -relativeString). Vous voulez probablement faire (CFURLRef) [self absoluteURL] à la place. –

+0

Nice, ça va marcher. Merci. –

+0

Bonne suggestion Mike, j'ai fait le réglage –

1

Vous pouvez convertir l'URL à une chaîne, ajoutez votre composant par rapport, puis le convertir en redirigeant vers une URL:

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];

Side note: Si l'URL se trouve être dans un fichier (vous pouvez utiliser la méthode stringByAppendingPathComponent: de NSString également, ce qui vous évite de choisir le bon séparateur pour vos chemins de base et relatifs.

+3

Ceci est une idée assez mauvais que vous auriez à gérer le traitement des slash exactement à droite. Plus une URL avec n'importe quoi après le chemin (chaîne de requête etc.) serait horriblement mutilée. –

2

Comme d'iOS 4.0, la classe NSURL fournit une méthode URLByAppendingPathComponent:.

+0

Mieux vaut tard que jamais. –

1

Je fixe en déplaçant la barre oblique de la tête de l'URL par rapport à la fin de l'URL de base, comme ceci:

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

Merci beaucoup pour ça! :) –

+0

Je suis heureux que cela ait aidé, s'il vous plaît upvote pour moi si vous pensez que c'est une bonne réponse, donc les autres sont plus susceptibles de le voir –

Questions connexes