2013-06-13 3 views
1

Я использую SDWebImage библиотеку и у меня есть этот код:Как я могу проверить, является ли NSUrl действительным URL-адресом изображения?

 [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-адрес изображения? или для этого лучше работать?

Ваша помощь очень уязвлена.

+0

проблема решена? – Rajneesh071

+0

@ Rajneesh071: я пробовал ваше решение один раз, и это сработало, хотя мы пошли на другое решение для решения проблемы, нам нужно внести изменения в наш серверный конец. –

ответ

7

вы можете проверить после получения 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 
      }); 

     } 

    }); 
+0

, если url возвращает некоторые данные json или мусора, чем эта логика не удастся. –

+1

Обратите внимание, что 'dataWithContentsOfURL' не должно использоваться в основном потоке, так как это может занять много времени. Вместо этого используйте асинхронные методы «NSURLConnection». – colincameron

+0

@SharonNathaniel: вы имеете в виду, что он рухнет с помощью json или возврата веб-страницы? –

0

Вы можете проверить, если URL заканчивается с некоторым именем изображения или not.You может получить части 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 и т. д.

+0

худший метод. Отметьте ответ olynoise –

4

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

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

Пример

NSURL *theURL = [NSURL URLWithString:string]; 
    NSError *err; 
    if ([theURL checkResourceIsReachableAndReturnError:&err] == NO) 
    { 
     NSLog(@"resource not reachable"); 
    } 
+0

, если url возвращает некоторые данные json или мусора, чем эта логика потерпит неудачу. – Rajneesh071

+0

это не сработало для меня, учитывая действительный URL изображения с сервера. –

+0

it Возвращает, доступен ли ресурс, на который указывает URL-адрес файла. Примечание: «URL-адрес файла», а не Интернет или другой URL-адрес схемы. –

2

Вот категория по 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 
0

В Swift:

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 
    } 
} 

например:

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