NSURL аналог CFURLCreateCopyAppendingPathComponent? - PullRequest
2 голосов
/ 24 июня 2009

Игра с URL-адресами, точнее говоря, построение их постепенно из других обнаруженных URL-адресов. При этом я хотел бы продолжать использовать объекты NSURL вместо манипулирования NSStrings, просто чтобы получить дополнительные проверки работоспособности и специфичные для URL методы из класса URL.

К сожалению, похоже, что нет способа заставить следующее объединиться, как я хочу:

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

Я хочу добавить их, чтобы получить:

<a href="http://my.url/path/sub/path" rel="nofollow noreferrer">http://my.url/path/sub/path</a>

Но лучшее, что я могу получить, это:

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

, который усекает путь на основании, в результате чего:

<a href="http://my.url/sub/path" rel="nofollow noreferrer">http://my.url/sub/path</a>

Есть функция CoreFoundation, которая делает это:

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

Что, кажется, работает нормально, но отскок назад от ObjC к C раздражает и раздражает ... Я бы предпочел просто манипулировать строками ... Я что-то упустил? Кроме того, чтобы быть слишком разборчивым, конечно. :)

Ответы [ 4 ]

5 голосов
/ 24 июня 2009

Это Цель 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

и затем:

*base = [NSURL URLWithString:@"http://my.url/path"];
*suffix = @"sub/path";
NSURL *final = [base urlByAppendingPathComponent:suffix];
NSLog( @"%@", final );
// displays http://my.url/path/sub/path
2 голосов
/ 16 февраля 2011

Начиная с iOS 4.0, класс NSURL предоставляет метод URLByAppendingPathComponent:.

1 голос
/ 06 мая 2013

Я исправил это, переместив косую черту от головы относительного URL-адреса до конца базового URL-адреса, например:

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
1 голос
/ 24 июня 2009

Вы можете преобразовать URL в строку, добавить относительный компонент, а затем преобразовать его обратно в 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];

Примечание: Если URL-адрес относится к файлу (не в вашем первоначальном примере, но в какой-то момент может помочь), вы также можете использовать метод stringByAppendingPathComponent: NSString - это изолирует вы выбираете правильный разделитель для вашей базы и относительных путей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...