我使用此代码从UIImage
URL
NSURL *imageURL = [NSURL URLWithString:@"http://testwebsite.com/image.png"];
NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageURL];
imageView.image = [UIImage imageWithData: imageData];
但是我被困在URL
看起来像这样的人:
http://www.testwebsite.com/getFile?userID=123
这在浏览器中工作正常但在上面的imageData
变量中返回nil。
如何从这样一个模糊的URL
加载图像(即从URL
加载不显示文件名但重定向到图像文件的图像?)
提前谢谢。
答案 0 :(得分:10)
出于某种奇怪的原因我必须使用:
[NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
当我创建URL
时,这解决了问题。
答案 1 :(得分:2)
NSData initWithContentsOfURL:
将返回nil
。(例如,如果您收到HTTP错误代码)。
您指向的网址可能会有一些引荐来阻止程序或Cookie要求阻止在您的应用程序中使用它(只是问题的一个建议)。
我建议您改为使用以下变体:
- (id)initWithContentsOfURL:(NSURL *)aURL options:(NSDataReadingOptions)mask error:(NSError **)errorPtr
如果返回值为零,请注意errorPtr
的值。
例如:
NSError *error;
NSData* imageData = [[NSData alloc] initWithContentsOfURL:
[NSURL URLWithString:@"http://example.com/notfound"]
options:0 error:&error];
if(imageData == nil) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"Got %u bytes", imageData.length);
}
您可以看到以下错误:
Error: Error Domain=NSCocoaErrorDomain Code=256 "The operation couldn’t be completed. (Cocoa error 256.)" UserInfo=0xa881c20 {NSURL=http://example.com/notfound}
答案 2 :(得分:0)
如果加载图像就像阻塞主线程一样,让应用程序无响应,我不确定initWithContentsOfURL:方法是否正在处理重定向,如果这是问题...你可以创建另一个类(例如,ImageFetcher使用NSURLConnection并实现NSURLConnectionDataDelegate。使用连接:来自NSURLConnectionDataDelegate的willSendRequest:redirectResponse:方法可以处理重定向,在连接中:didReceiveData:方法可以将接收到的数据附加到NSMutableData(不能保证一次接收所有数据)。此外,如果实现连接,则不必等待连接完成或下载任何数据:didReceiveResponse:方法并检查响应是否指示错误,并且在connectionDidFinishLoading:方法中,您可以调用另一种方法来更新图像view(或使用适当的数据调用ImageFetcher类的委托来更新图像视图)。
答案 3 :(得分:0)
NSURL URLWithString:@""如果URL不符合RFC 2396并且必须对其进行转义,则返回nil
如果您通过链接阅读rfc2396,您将获得大量详细信息
我找到了一个很棒的网站,用于检查违规字符的位置,选择网址
的路径选项