Iphone 如何检查NSUrl是否为有效的图像url?
我正在使用Iphone 如何检查NSUrl是否为有效的图像url?,iphone,ios,sdwebimage,Iphone,Ios,Sdwebimage,我正在使用SDWebImage库,我有以下代码: [cell.imgLogo setImageWithURL:[NSURL URLWithString:[item objectForKey:@"s_logo"]] placeholderImage:[UIImage imageNamed:@"default.png"]]; 我对库SDWebImage进行了一些调整,以忽略方法downloadWithURL:delegate:options:userInfo::
SDWebImage
库,我有以下代码:
[cell.imgLogo setImageWithURL:[NSURL URLWithString:[item objectForKey:@"s_logo"]] placeholderImage:[UIImage imageNamed:@"default.png"]];
我对库SDWebImage
进行了一些调整,以忽略方法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
它不显示任何内容,删除占位符图像,不显示任何内容
那么我如何识别一个有效的图像url呢?还是有更好的解决办法
非常感谢您的帮助。您可以在从
NSURL
获取NSData
后进行检查。您可以使用下载数据
下面是我创建的一个示例,它将您的图像保存在照片库中
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是否以某个图像名称结尾。您可以通过以下方式获取url的各个部分:
NSURL* url = [NSURL URLWithString:@"http://digg.com/news/business/24hr"];
NSString* reducedUrl = [NSString stringWithFormat:
@"%@://%@/%@",
url.scheme,
url.host,
[url.pathComponents objectAtIndex:1]];
现在,获取
路径组件的最后一个对象,并检查它是否包含.png或.jpg等。NSURL中有方法检查文件是否存在
- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error
范例
NSURL *theURL = [NSURL URLWithString:string];
NSError *err;
if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
{
NSLog(@"resource not reachable");
}
以下是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
迅速:
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:
如果url返回一些json或垃圾数据,则此逻辑将失败。请注意,主线程上不应使用dataWithContentsOfURL
,因为失败可能需要很长时间。相反,请使用NSURLConnection
的异步方法。@SharonNathaniel:你的意思是它将因json或网页返回而崩溃?@SharonNathaniel->现在检查此代码中的buddyso,如果url是xml页面或json或任何非图像url的url,则转到image==nil?如果url返回一些json或垃圾数据,则此逻辑将失败。如果服务器提供了有效的图像url,则此逻辑对我无效。它返回是否可以访问文件url指向的资源。注意:“文件URL”,而不是Internet或其他方案URL。@Rajneesh071:我曾经尝试过您的解决方案,但效果很好,尽管我们使用了不同的解决方案来解决问题,但我们需要修改我们的服务器端。最坏的方法。检查你的答案
let url = NSURL(fileURLWithPath: "/Users/i/Desktop/image.png")
url.isImage //--> true