【问题标题】:Is there any way to know which Class instance , NSData Object contains?有什么方法可以知道 NSData Object 包含哪个 Class 实例?
【发布时间】:2014-02-19 15:00:48
【问题描述】:

我有一个从网络服务器获得的 NSData 对象。

这个数据对象的内容应该是一个 UIImage 。但是当我在以下代码中使用它时:-

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData * responseData, NSError *err) {

    if (err) {
        NSLog(@"Err %@",err.description);

    }else
    {

        if (responseData) 
        {
            NSLog(@"Data Length %d  ",[responseData length]);
            UIImage *img = [[UIImage alloc] initWithData:responseData];

            if (img) {
                NSLog(@"image in not null");
                self.imageView.image = img;
            }
            else
            {
                NSLog(@"image is null");
            }
        }

        else
        {
            NSLog(@"not returning anything");
        }
    }
}];

输出说:-

Data Length 2786779
image is null

所以我猜它不是图像

有没有办法让我知道这个 NSData 包含哪个类实例

PS:- 我也用过

NSLog("Description %@",data.description);

但它只生成了大量的十六进制代码

【问题讨论】:

  • isKindofClass 你试过了吗?
  • 来自远程服务器的图像数据可能是Base64编码的,你可以解码。
  • 来自文档:“指定数据的新图像对象,如果方法无法从指定数据初始化图像,则为 nil。”您的数据未被识别为图像,可能是后端问题?
  • 您确定您的网址是图片网址吗?您可以尝试下载类似 google 图像的简单图像并验证:google.fr/images/srpr/logo11w.png
  • @OMerObaid :嗯......那不是要返回我 NSData 吗?因为它是一个 NSData 对象

标签: ios iphone objective-c cocoa-touch nsdata


【解决方案1】:

嗯.... 您的服务器可能正在发送图像,但它已编码。

获取 UIImage *img = null 并不一定意味着响应数据不是图像。如果你不把它解码回来,它当然是空的

我认为您的响应数据是用 Base64 编码的......(大多数服务器都这样做)

如果是这样,...

首先从 Link 下载 .h 和 .m 文件

在您的项目中添加和导入它们。

然后使用此代码

NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSData *data = [NSData dataFromBase64String:str];
UIImage *img = [[UIImage alloc] initWithData:data];

此 img 将包含您的图像。如果您的服务器真的在发送图像。

请注意.. 此代码中并非所有 NSString *str 都是 UIImage 的表示 它可能是其中的一部分。其余的可以是与该图像相关的信息。 所以你只需要解码响应的图像部分。

希望这会有所帮助....

【讨论】:

  • 哇...这正是我需要的。 .你是救世主..:)
  • @DemonSOCKET 例如,服务器发送一个图像为image/png,服务器base64解码它绝对没有意义。例如,如果响应是 JSON,并且图像将被嵌入到 JSON 字符串中——它必须是字符(而不是二进制),这将是有意义的。因此,您似乎以一种不太理想的方式接收图像。我会检查的。
  • @An_ISOL'iean “大多数”服务器不会对图像进行 base64 编码。事实上,这不是必需的。服务器将根据其“Content-Type”发送图像。例如,这可以是 image/png - 这允许服务器以 PNG 格式的 二进制 格式发送图像,除非服务器中有虚假内容。
【解决方案2】:

NSData 对象包含字节序列,而不是对象(例如 UIImages)。不过,它可以是图像的表示。

您应该检查响应的“Content-Type”标头。它是一种 MIME 类型,用于指定响应正文中的数据类型(另请参阅 wiki Internet media type)。

您可以从NSURLResponse 获取 MIME 类型作为 NSString,如下所示:

NSString* mimeType = [response MIMEType];

(另见NSURLResponse Class Reference

一个MIME类型由一个type和一个subtype组成,并且可能包含“参数”。

例如,text/plain; charset=utf-8 是“类型”为“文本”且“子类型”为“普通”的媒体类型。它有一个参数指定字节序列的字符编码,在本例中为 Unicode UTF-8。

在您的示例中,您希望 MIME 类型的“类型”等于“图像”,例如:

image/gifimage/jpegimage/png

【讨论】:

  • 好吧..我已经按照你的建议进行了检查,mimeType 是“text/plain”。实际上@An_ISOL'iean 的回答起到了作用。但我不太确定这里到底发生了什么。你能帮我理解吗?
【解决方案3】:

我认为您的数据不是图像数据。 使用以下代码将数据记录为 NSString 并查看结果。

NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

【讨论】:

    猜你喜欢
    • 2017-05-04
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多