1

我正在以以下格式下载 iOS 中的图像:

    "Content-Encoding" = gzip;
    "Content-Type" = "text/html";
    Date = "Thu, 31 Oct 2013 19:08:58 GMT";
    Expires = "Thu, 01 Jan 1970 00:00:00 GMT";
    "Set-Cookie" = "JSESSIONID=1mrh644zbpgutn1xk116n825u;Path=/";
    "Transfer-Encoding" = Identity;

我正在尝试使用这个:https ://github.com/st3fan/cocoa-utils/blob/master/src/NSDataGZipAdditions.m来进行取消归档......但它似乎没有工作。

这是我当前无法正常工作的代码:

NSString *authHeader = [NSString stringWithFormat:@"OAuth %@", credentials.accessToken];
    NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:myURL];
    [request addValue:authHeader forHTTPHeaderField:@"Authorization"];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue new] completionHandler:^(NSURLResponse *response, NSData *data, NSError *err) {
        NSLog(@"Response: %@", response);
        if (err) {
            NSLog(@"Error: %@", err);
        }
        //here create file from _data_

        NSData *mydata = [NSData dataWithCompressedData:data];
        self.propImg1.image = [UIImage imageWithData:mydata];
        [self.propImg1 setNeedsLayout];

有谁知道如何做到这一点?

谢谢

4

1 回答 1

1
  1. 我建议查看响应statusCode并确保它是200.

  2. 你说你的服务器报告了Content-Encoding一个

    "Content-Encoding" = gzip;
    

    这并不意味着您NSData是 gzip 数据。我相信一些网络服务器可以透明地压缩它们的响应,而 iOS 会透明地为你解压缩。对于大多数 Web 服务器请求,您通常不必使用 gzip 库来解压缩。

    Content-Type会建议响应不是图像来证明这一点:

    "Content-Type" = "text/html";
    

    诚然,我们应该犹豫从中得出太多结论Content-Type(因为一些自定义 Web 服务在设置方面草率),但这与您断言结果NSData是 gzip 数据不一致。

    您在下面添加了一条评论,向我们展示了NSData, 实际上是一个字符串脚本。看起来它可能是 HTML,而不是图像。

  3. 我会NSLogdata或在此块内设置断点并在调试器中发出po data命令)并查看它的外观,并消除此处的歧义。如果它主要是介于20and之间的十六进制值7f(加上偶尔的0a甚至可能是 a 0d),则表明响应是一个字符串,然后您可以将其记录为字符串。

    也许您可以使用十六进制转储的前几行来更新您的问题data,我们可以帮助您诊断发生了什么(因为您通常可以查看前几个字节并确认它是文本、gzip 还是图像)。

    或者,既然您已经确认它是一个字符串响应(看起来可能是 HTML),您应该将它转换为 aNSString并记录它,然后您会看到发生了什么。

  4. 顺便说一句,当您修复您的请求问题时,由于您正在完成块中进行 UI 更新,请使用[NSOperationQueue mainQueue]您的完成块,或者确保将 UI 更新分派回主队列(正如我在我下面的例子)。

因此:

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue new] completionHandler:^(NSURLResponse *response, NSData *data, NSError *err) {
    NSLog(@"Response: %@", response);
    if (err) {
        NSLog(@"Error: %@", err);
    }

    NSInteger statusCode = -1;
    if ([response isKindOfClass:[NSHTTPURLResponse class]])
    {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        statusCode = httpResponse.statusCode;
    }

    NSLog(@"statusCode = %d", statusCode); // this should be 200
    NSLog(@"data = %@", data);             // if really text, you'll largely see values b/w 20 and 7f and the occasional 0a

    // if it does look like largely 20-7f and a few 0a values, then try displaying it as a string:
    //
    // NSLog(@"data string = %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    //here create file from _data_

    NSData *mydata = [NSData dataWithCompressedData:data];
    if (mydata) {
        UIImage *image = [UIImage imageWithData:mydata];
        if (image) {
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                self.propImg1.image = image;
                [self.propImg1 setNeedsLayout];
            }];
        }
    }

    // ...
}];
于 2013-10-31T19:50:25.350 回答