+ [NSURL URLWithString:]返回nil

时间:2013-11-26 14:10:48

标签: ios iphone uiimageview nsurl

我使用此代码从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加载不显示文件名但重定向到图像文件的图像?)

提前谢谢。

4 个答案:

答案 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,您将获得大量详细信息

我找到了一个很棒的网站,用于检查违规字符的位置,选择网址

的路径选项

http://www.websitedev.de/temp/rfc2396-check.html.gz