我正在使用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;
}
}
所以现在它可以使用空字符串,只是为了显示它的默认图像,但问题是当它出现在一个不像图像网址的字符串时:
http://beta.xxxxxxx.com/gangnamwe?to=boko
它不显示任何内容,它会删除占位符图像并且不显示任何内容。
那么我如何识别有效的图片网址?或者有更好的解决方法吗?
你的帮助很大。
答案 0 :(得分: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
});
}
});
答案 1 :(得分:4)
NSURL中有方法检查文件是否存在。
- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error
实施例
NSURL *theURL = [NSURL URLWithString:string];
NSError *err;
if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
{
NSLog(@"resource not reachable");
}
答案 2 :(得分: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
答案 3 :(得分:0)
您可以检查网址是否以某个图片名称结尾。您可以通过以下方式获取网址的各个部分:
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等。
答案 4 :(得分: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