【问题标题】:how can i check if NSUrl is a valid image url?我如何检查 NSUrl 是否是有效的图像 url?
【发布时间】:2013-06-13 10:19:02
【问题描述】:

我正在使用SDWebImage 库,我有这个代码:

     [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

它什么都不显示,它删除占位符图像并且什么都不显示。

那么我将如何识别有效的图片网址?还是有更好的解决方法?

非常感谢您的帮助。

【问题讨论】:

  • @Rajneesh071:我已经尝试过您的解决方案,并且成功了,尽管我们采用了不同的解决方案来解决问题,但我们需要修改我们的服务器端。

标签: iphone ios sdwebimage


【解决方案1】:

您可以在从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
            });

        }

    });

【讨论】:

  • 如果 url 返回一些 json 或垃圾数据,则此逻辑将失败。
  • 请注意,dataWithContentsOfURL 不应在主线程上使用,因为它可能需要很长时间才能失败。而是使用NSURLConnection 的异步方法。
  • @SharonNathaniel:你的意思是它会在 json 或网页返回时崩溃?
  • @SharonNathaniel -> 现在检查好友
  • 所以在这段代码中,如果 url 是 xml 页面或 json 或任何不是图像 url 的 url,它会转到 image==nil?
【解决方案2】:

NSURL 中有方法可以检查文件是否存在。

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

例子

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

【讨论】:

  • 如果 url 返回一些 json 或垃圾数据,则此逻辑将失败。
  • 它对我不起作用,因为它提供了来自服务器的有效图像 URL。
  • it 返回文件URL指向的资源是否可以到达。注意:“文件 URL”,不是 Internet 或其他方案 URL。
【解决方案3】:

这是 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

【讨论】:

    【解决方案4】:

    您可以检查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 等。

    【讨论】:

    • 最坏的方法。检查 olynoise 的答案
    【解决方案5】:

    在斯威夫特中:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2010-10-29
      相关资源
      最近更新 更多