У меня есть NSURL:
serverCall? x=a&y=b&z=c
Каков самый быстрый и самый эффективный способ получить значение y?
Спасибо
ОБНОВЛЕНИЕ:
С 2010 года, когда это было написано, Apple, похоже, выпустила набор инструментов для этой цели. См. Ответы на эти вопросы ниже.
Традиционное решение:
Я знаю, что вы сказали « самый быстрый способ », но после того, как я начал проводить тест с NSScanner
, я просто не мог остановиться. И хотя это не самый короткий путь, он наверняка пригодится, если вы планируете часто использовать эту функцию. Я создал класс URLParser
, который получает эти переменные с помощью NSScanner
. Используется просто:
URLParser *parser = [[[URLParser alloc] initWithURLString:@"http://blahblahblah.com/serverCall?x=a&y=b&z=c&flash=yes"] autorelease];
NSString *y = [parser valueForVariable:@"y"];
NSLog(@"%@", y); //b
NSString *a = [parser valueForVariable:@"a"];
NSLog(@"%@", a); //(null)
NSString *flash = [parser valueForVariable:@"flash"];
NSLog(@"%@", flash); //yes
И класс, который это делает, следующий (* исходные файлы внизу сообщения):
URLParser.h
@interface URLParser : NSObject {
NSArray *variables;
}
@property (nonatomic, retain) NSArray *variables;
- (id)initWithURLString:(NSString *)url;
- (NSString *)valueForVariable:(NSString *)varName;
@end
URLParser.m
@implementation URLParser
@synthesize variables;
- (id) initWithURLString:(NSString *)url{
self = [super init];
if (self != nil) {
NSString *string = url;
NSScanner *scanner = [NSScanner scannerWithString:string];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
NSString *tempString;
NSMutableArray *vars = [NSMutableArray new];
[scanner scanUpToString:@"?" intoString:nil]; //ignore the beginning of the string and skip to the vars
while ([scanner scanUpToString:@"&" intoString:&tempString]) {
[vars addObject:[tempString copy]];
}
self.variables = vars;
[vars release];
}
return self;
}
- (NSString *)valueForVariable:(NSString *)varName {
for (NSString *var in self.variables) {
if ([var length] > [varName length]+1 && [[var substringWithRange:NSMakeRange(0, [varName length]+1)] isEqualToString:[varName stringByAppendingString:@"="]]) {
NSString *varValue = [var substringFromIndex:[varName length]+1];
return varValue;
}
}
return nil;
}
- (void) dealloc{
self.variables = nil;
[super dealloc];
}
@end
* если вы не Мне не нравится копирование и вставка, вы можете просто загрузить исходные файлы - я сделал небольшую запись в блоге об этом здесь .
Я бы порекомендовал посмотреть на getResourceValue:forKey:error:
. Думаю, параметр forKey
будет y
.
Я почти уверен, что вам придется разобрать это самостоятельно. Однако это не так уж и плохо:
NSString * q = [myURL query];
NSArray * pairs = [q componentsSeparatedByString:@"&"];
NSMutableDictionary * kvPairs = [NSMutableDictionary dictionary];
for (NSString * pair in pairs) {
NSArray * bits = [pair componentsSeparatedByString:@"="];
NSString * key = [[bits objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString * value = [[bits objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[kvPairs setObject:value forKey:key];
}
NSLog(@"y = %@", [kvPairs objectForKey:@"y"]);
Самое быстрое:
NSString* x = [url valueForQueryParameterKey:@"x"];