NSURL类似于CFURLCreateCopyAppendingPathComponent?

Nic*_*eys 2 objective-c ios

使用URL,更具体地说,是从其他已发现的URL逐步构建它们.在这样做时,我想继续使用NSURL对象而不是操纵NSStrings,只是为了从URL类中获得额外的健全性检查和特定于URL的方法.

不幸的是,似乎没有办法让以下内容加入到我希望的方式:

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

我想追加他们:

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

但我能得到的最好的是:

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

哪个修剪了基础上的路径,导致:

http://my.url/sub/path

有一个CoreFoundation函数可以做到:

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

这似乎工作正常,但从ObjC到C的反复弹跳是令人不快和恼人的...我宁愿只是操纵字符串...我错过了什么?除了当然太挑剔了.:)

Pet*_*wis 5

这是目标C - 如果NSURL不能满足您的需求,请添加扩展类别.

@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
Run Code Online (Sandbox Code Playgroud)

然后:

*base = [NSURL URLWithString:@"http://my.url/path"];
*suffix = @"sub/path";
NSURL *final = [base urlByAppendingPathComponent:suffix];
NSLog( @"%@", final );
// displays http://my.url/path/sub/path
Run Code Online (Sandbox Code Playgroud)