2013-06-13 42 views
1

我使用SDWebImage庫,我有這樣的代碼:我如何檢查NSUrl是否有效的圖片網址?

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

我捏捏庫SDWebImage有點忽略空字符串或方法downloadWithURL: delegate: options: userInfo:與空字符串NSURL:

 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 

它不顯示任何內容,它刪除佔位符圖像並不顯示任何內容。

那麼,我將如何確定一個有效的圖像網址?或者有沒有更好的解決方法呢?

你的幫助是非常appreaciated。

+0

問題解決了嗎? – Rajneesh071

+0

@ Rajneesh071:我曾試過一次你的解決方案,它的工作,雖然我們去了一個不同的解決方案來解決問題,我們需要修改我們的服務器端。 –

回答

7

你可以從NSURL得到NSData後檢查。您可以使用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

它返回是否可以到達文件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

在斯威夫特:

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