Parse NSURL-схема iOS [дубликат]

И если вы хотите работать с объектом данных, эти два очень важны:

Serializable vs Parcelable

  • Serializable - это интерфейс маркера, который подразумевает, что пользователь не может маршалировать данные в соответствии с их требованиями. Поэтому, когда объект реализует Serializable Java, он автоматически сериализует его.
  • Parcelable - собственный протокол сериализации android. В Parcelable разработчики пишут собственный код для маршалинга и разборки. Таким образом, он создает меньше объектов для мусора по сравнению с Serialization
  • . Производительность Parcelable очень высока по сравнению с Serializable из-за его пользовательской реализации. Настоятельно рекомендуется использовать Parcelable имплантацию при сериализации объектов в android.

public class User implements Parcelable

подробнее здесь

37
задан randombits 5 May 2011 в 20:34
поделиться

4 ответа

NSURL имеет метод pathComponents, который возвращает массив со всеми различными компонентами пути. Это должно помочь вам получить целую часть. Чтобы получить имя, я бы использовал метод host для NSURL. Документы говорят, что он должен работать, если URL-адрес должным образом отформатирован, может также дать ему попробовать.

В общем, нет необходимости конвертировать в строку, похоже, есть много методов для разработки компонентов URL-адреса из самого объекта NSURL.

19
ответ дан Henri Normak 19 August 2018 в 15:42
поделиться

На самом деле есть лучший способ разобрать NSURL. Используйте NSURLComponents. Вот пример simle:

Swift:

extension URL {
    var params: [String: String]? {
        if let urlComponents = URLComponents(url: self, resolvingAgainstBaseURL: true) {
            if let queryItems = urlComponents.queryItems {
                var params = [String: String]()
                queryItems.forEach{
                    params[$0.name] = $0.value
                }
                return params
            }
        }
        return nil
    }
}

Objective-C:

NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSArray *queryItems = [components queryItems];

    NSMutableDictionary *dict = [NSMutableDictionary new];

    for (NSURLQueryItem *item in queryItems)
    {
        [dict setObject:[item value] forKey:[item name]];
    }
8
ответ дан Andrei Malygin 19 August 2018 в 15:42
поделиться
  • 1
    Спасибо, это сработало для меня :-) – Akshay Hastekar 3 May 2017 в 10:52

Спасибо Нику за то, что указали мне в правильном направлении.

Я хотел сравнить URL-адреса файлов, но у меня были проблемы с дополнительными косыми чертами, делающими isEqualString бесполезным. Вы можете использовать мой пример ниже для сравнения двух URL-адресов, сначала деконструируя их, а затем сравнивая части друг с другом.

- (BOOL) isURLMatch:(NSString*) url1 url2:(NSString*) url2
{
    NSURL *u1 = [NSURL URLWithString:url1];
    NSURL *u2 = [NSURL URLWithString:url2];

    if (![[u1 scheme] isEqualToString:[u2 scheme]]) return NO;
    if (![[u1 host] isEqualToString:[u2 host]]) return NO;
    if (![[url1 pathComponents] isEqualToArray:[url2 pathComponents]]) return NO;

    //check some properties if not nil as isEqualSting fails when comparing them
    if ([u1 port] && [u2 port])
    {
        if (![[u1 port] isEqualToNumber:[u2 port]]) return NO;
    }

    if ([u1 query] && [u2 query])
    {
        if (![[u1 query] isEqualToString:[u2 query]]) return NO;
    }
    return YES;
}  
0
ответ дан Anthony De Souza 19 August 2018 в 15:42
поделиться

Я могу только добавить пример здесь, класс NSURL - это тот, который нужно выполнить. Это не является полным, но даст вам подсказку о том, как использовать NSURL:

NSString *url_ = @"foo://name.com:8080/12345;param?foo=1&baa=2#fragment";
NSURL *url = [NSURL URLWithString:url_];

NSLog(@"scheme: %@", [url scheme]); 
NSLog(@"host: %@", [url host]); 
NSLog(@"port: %@", [url port]);     
NSLog(@"path: %@", [url path]);     
NSLog(@"path components: %@", [url pathComponents]);        
NSLog(@"parameterString: %@", [url parameterString]);   
NSLog(@"query: %@", [url query]);       
NSLog(@"fragment: %@", [url fragment]);

output:

scheme: foo
host: name.com
port: 8080
path: /12345
path components: (
    "/",
    12345
)
parameterString: param
query: foo=1&baa=2
fragment: fragment

Этот параметр Q & amp; A NSURL'sString с использованием of ';' vs '& amp;' также интересен в отношении URL-адресов.

185
ответ дан Community 19 August 2018 в 15:42
поделиться
  • 1
    Спасибо, что написал все это – Sneakyness 26 January 2013 в 01:16
  • 2
    По моему опыту, использование pathComponents является рискованным. Действительно, если ваши компоненты пути содержат /, EVEN ENCODED, pathComponents будут декодировать его и считать его разделителем. Я бы лучше проанализировал компоненты пути. – Aurelien Porte 23 January 2015 в 11:06
  • 3
    все, кажется, работает, кроме [url parameterString] ... любые идеи, почему это может быть «(null)») если [url absoluteString] содержит именно то, что я хочу? – whyoz 10 September 2015 в 20:25
  • 4
    вот список всех компонентов NSURL: i-phone-dev.blogspot.com/2013/08/nsurl-components.html Это на самом деле показывает параметрString как (null) тоже? – whyoz 10 September 2015 в 20:45
  • 5
    Отлично. Точно то, что я искал. – sansid1983 8 October 2015 в 10:42