2013-06-13 39 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