Подтвердить что ты не робот

Надежный способ сравнить два NSURL или один NSURL и NSString?

Недавно у меня была проблема при сравнении двух NSURL и сравнить один NSURL с NSString (который является URL-адресом), ситуация в том, что я получил NSURLRequest откуда-то, я могу или не могу знать адрес URL, на который он указывает, и у меня есть URL-адрес NSString, скажем, "http://m.google.com" , теперь мне нужно проверить, совпадает ли URL-адрес в этом NSURLRequest со строкой URL-адреса, которую я имел:

[[request.URL.absoluteString lowercaseString] isEqualToString: [self.myAddress lowercaseString]];

это возвращает NO, поскольку absoluteString дает мне "http://m.google.com/", тогда как моя строка "http://m.google.com" без косой черты в конце, даже если я создайте NSURLRequest, используя

[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.google.com"]]

он по-прежнему дает мне "http://m.google.com/" для absoluteString, интересно, есть ли какой-либо надежный способ сравнить с NSURL или одним NSURL и одним NSString?

  • проверьте, содержит ли "один" другой, но это не является надежным, поскольку "http://m.google.com/blabla" содержит "http://m.google.com" .

  • конвертировать NSString в NSURL и использовать метод isEqual для сравнения двух NSURL и, надеюсь, реализация NSURL isEqual может понять это?

  • на основе шага 2, но конвертируйте каждый NSURL в стандартный URL, используя standardizedURL?

Спасибо большое!

4b9b3361

Ответ 1

Если вы заботитесь только о двусмысленном сальнике, вы можете быстро отказаться от этого вопроса, зная, что путь NSURL обрезает конечную косую черту.

Но мне нравится идея метода категории на NSURL, который реализует некоторую эквивалентность на основе стандартов ( "эквивалентность", вероятно, является лучшим термином, чем равенство в этом случае).

@RobNapier ссылается на соответствующий вопрос с хорошим ответом, который указывает на RFC2616. Другим важным стандартом синтаксиса url является RFC1808.

Жесткая часть решает, что мы подразумеваем под эквивалентностью, например, что касается разных запросов или фрагментов (якорных ссылок)? Код ниже errs на стороне вседозволенности для большинства этих двусмысленностей...

// in NSURL+uriEquivalence.m

- (BOOL)isEquivalent:(NSURL *)aURL {

    if ([self isEqual:aURL]) return YES;
    if ([[self scheme] caseInsensitiveCompare:[aURL scheme]] != NSOrderedSame) return NO;
    if ([[self host] caseInsensitiveCompare:[aURL host]] != NSOrderedSame) return NO;

    // NSURL path is smart about trimming trailing slashes
    // note case-sensitivty here
    if ([[self path] compare:[aURL path]] != NSOrderedSame) return NO;

    // at this point, we've established that the urls are equivalent according to the rfc
    // insofar as scheme, host, and paths match

    // according to rfc2616, port can weakly match if one is missing and the
    // other is default for the scheme, but for now, let insist on an explicit match
    if ([self port] || [aURL port]) {
        if (![[self port] isEqual:[aURL port]]) return NO;
        if (![[self query] isEqual:[aURL query]]) return NO;
    }

    // for things like user/pw, fragment, etc., seems sensible to be
    // permissive about these.
    return YES;
}

Ответ 2

Я знаю, что на это дан ответ. Но я не думаю, что это понятно.

Я хотел бы рекомендовать следующее.

if ([[url1 absoluteString] isEqualToString:[url2 absoluteString]]) 
{
   //Add your implementation here
}

Ответ 3

Легкий способ:

NSString*urlString=[NSString stringWithFormat:@"%@",request.URL];

поэтому вы сравниваете метод NSString isEqual:

BOOL equalty=[urlString isEqual:anotherNSString];

XD