как я могу проверить, является ли NSUrl допустимым URL-адресом изображения?

Я использую библиотеку SDWebImage, и у меня есть этот код:

     [cell.imgLogo setImageWithURL:[NSURL URLWithString:[item objectForKey:@"s_logo"]]         placeholderImage:[UIImage imageNamed:@"default.png"]];

Я немного подправил библиотеку SDWebImage, чтобы игнорировать пустую строку или NSUrl с пустой строкой в ​​методе downloadWithURL: delegate: options: userInfo::

     if ([url isKindOfClass:NSString.class])
     {
         if ([(NSString *)url length] > 0) {
              url = [NSURL URLWithString:(NSString *)url]; 
         } else {
              return;
         }
    }
    else if (![url isKindOfClass:NSURL.class])
    {
         url = nil; // Prevent some common crashes due to common wrong values passed like NSNull.null for instance
    }
    else if ([url isKindOfClass:NSURL.class]) {
         if ([[url absoluteString] length] > 0) {
              //valid url
         } else {
             return;
         }
     }

Итак, теперь он работает с пустой строкой и просто отображает изображение по умолчанию, но проблема заключается в том, что когда речь идет о строке, которая не является URL-адресом изображения, например:

     http://beta.xxxxxxx.com/gangnamwe?to=boko

Он ничего не отображает, удаляет замещающее изображение и ничего не отображает.

Итак, как мне определить действительный URL-адрес изображения? или есть лучшая работа для этого?

Ваша помощь очень ценится.


person Arnlee Vizcayno    schedule 13.06.2013    source источник
comment
@ Rajneesh071: я однажды попробовал ваше решение, и оно сработало, хотя мы выбрали другое решение для решения проблемы, нам нужна модификация нашего сервера.   -  person Arnlee Vizcayno    schedule 19.06.2013


Ответы (5)


вы можете проверить после получения NSData от NSURL . Вы можете использовать GCD для загрузки данные

вот пример, который я создал, который сохраняет ваше изображение в библиотеке фотографий.

dispatch_async(dispatch_queue_create("com.getImage", NULL), ^(void) {

        NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKII9COB-hvMef4Zvb9XYVbXKDFZHJAHwwzzGyMiy_b-q65GD43Chd37jH"]];
        UIImage *image=[UIImage imageWithData:data];
        if (image==nil) {
            //yourImageURL is not valid
            image=[UIImage imageNamed:@"placeholder.png"];
        }
        else{

            //yourImageURL is valid
            dispatch_async(dispatch_get_main_queue(), ^{
                UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
                //show your image
            });

        }

    });
person Rajneesh071    schedule 13.06.2013
comment
если URL-адрес возвращает некоторые данные json или мусор, эта логика не сработает. - person Sharon Nathaniel; 13.06.2013
comment
Обратите внимание, что dataWithContentsOfURL не следует использовать в основном потоке, так как это может занять много времени. Вместо этого используйте асинхронные методы NSURLConnection. - person colincameron; 13.06.2013
comment
@SharonNathaniel: вы имеете в виду, что произойдет сбой с json или возвратом веб-страницы? - person Arnlee Vizcayno; 13.06.2013
comment
@SharonNathaniel -› теперь проверь, приятель - person Rajneesh071; 13.06.2013
comment
поэтому в этом коде, если URL-адрес является страницей xml, json или любым URL-адресом, который не является URL-адресом изображения, он переходит к image == nil? - person Arnlee Vizcayno; 14.06.2013
comment
См. мой ответ, чтобы узнать, как проверить тип файла без предварительной загрузки файла. - person olynoise; 19.09.2015

В NSURL есть способ проверить, существует ли файл.

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

Пример

    NSURL *theURL = [NSURL URLWithString:string];
    NSError *err;
    if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
    {
        NSLog(@"resource not reachable");
    }
person iCoder    schedule 13.06.2013
comment
если URL-адрес возвращает некоторые данные json или мусор, эта логика не сработает. - person Rajneesh071; 13.06.2013
comment
это не сработало для меня, учитывая действительный URL-адрес изображения с сервера. - person Arnlee Vizcayno; 16.11.2016
comment
Возвращает, доступен ли ресурс, на который указывает URL-адрес файла. Примечание: URL-адрес файла, а не URL-адрес Интернета или другой схемы. - person Lal Krishna; 20.02.2017

Вот категория на NSURL для вас:

// nsurl+documentTypes.h
@interface NSURL (documentTypes)
- (BOOL)isImageType;
@end

// nsurl+documentTypes.m
@implementation NSURL (documentTypes)

- (BOOL)isImageType
{
    NSString * UTI = (__bridge NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,(__bridge CFStringRef)[self pathExtension],NULL);
    return UTTypeConformsTo((__bridge CFStringRef)UTI, kUTTypeImage);   
}
@end
person olynoise    schedule 18.09.2015

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

NSURL* url = [NSURL URLWithString:@"http://digg.com/news/business/24hr"];
NSString* reducedUrl = [NSString stringWithFormat:
    @"%@://%@/%@",
    url.scheme,
    url.host,
    [url.pathComponents objectAtIndex:1]];

Теперь возьмите последний объект pathComponents и проверьте, содержит ли он .png или .jpg и т. д.

person Sharon Nathaniel    schedule 13.06.2013
comment
худший метод. Проверьте ответ олинойза - person Lal Krishna; 20.02.2017

В Свифте:

import Foundation

public extension NSURL {

    public var isImage: Bool {
        return UTI.map{ UTTypeConformsTo($0, kUTTypeImage) } ?? false
    }

    public var UTI: String? {
        var value: AnyObject?
        let _ = try? getResourceValue(&value, forKey: NSURLTypeIdentifierKey)
        return value as? String
    }
}

e.g:

let url = NSURL(fileURLWithPath: "/Users/i/Desktop/image.png")
url.isImage //--> true
person Milos    schedule 01.03.2016