2

我正在使用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

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

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

非常感谢您的帮助。

4

5 回答 5

8

你可以NSDataNSURL. 您可以使用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
            });

        }

    });
于 2013-06-13T10:26:06.053 回答
4

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

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

例子

    NSURL *theURL = [NSURL URLWithString:string];
    NSError *err;
    if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
    {
        NSLog(@"resource not reachable");
    }
于 2013-06-13T10:32:00.337 回答
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
于 2015-09-18T22:59:53.077 回答
0

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

于 2013-06-13T10:30:11.687 回答
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
    }
}

例如:

let url = NSURL(fileURLWithPath: "/Users/i/Desktop/image.png")
url.isImage //--> true
于 2016-03-01T14:03:04.597 回答