Three20 - TTStyledTextLabel遇到base64图像数据而不是URL - 崩溃

时间:2011-03-21 17:37:24

标签: iphone xml ios three20

我正在使用TTStyledTextLabel和来自XHTML数据的TTStyledText来显示新闻文章。 它工作正常,除了img是数据而不是链接,在这种情况下它会崩溃!

代码

TTStyledTextLabel *storyLabel = [[TTStyledTextLabel alloc] init]; 
[storyLabel setText: [TTStyledText textFromXHTML:[articleContents objectForKey:@"storyText"]]]; 

使用普通的img url xml,

但遇到像这样的图像数据时:

img class="alignleft" src="data:image/jpg;base64,/9j/4AAQSkZJRgA... 
(lots more in here)...1HhI0T//2Q==" alt="" width="267" height="189" / 

它与输出崩溃:

-[NSURLResponse allHeaderFields]: unrecognized selector 
sent to instance 0xb83b370 

只有在遇到图像数据时才会发生这种情况,否则如果它是正常的img链接,它就可以正常加载。

谢谢!

2 个答案:

答案 0 :(得分:2)

问题是Three20 TTRequestLoader在NSURLConnectionDataDelegate方法中使用NSHTTPURLResponse而不是NSURLResponse。 NSURLResponse没有allHeaderFields方法,因此应用程序崩溃了。

您可以通过检查课程来修复它:

- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSHTTPURLResponse*)response {
  _response = [response retain];

  if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
    NSDictionary* headers = [response allHeaderFields];
    int contentLength = [[headers objectForKey:@"Content-Length"] intValue];

    // If you hit this assertion it's because a massive file is about to be downloaded.
    // If you're sure you want to do this, add the following line to your app delegate startup
    // method. Setting the max content length to zero allows anything to go through. If you just
    // want to raise the limit, set it to any positive byte size.
    // [[TTURLRequestQueue mainQueue] setMaxContentLength:0]
    TTDASSERT(0 == _queue.maxContentLength || contentLength <=_queue.maxContentLength);

    if (contentLength > _queue.maxContentLength && _queue.maxContentLength) {
      TTDCONDITIONLOG(TTDFLAG_URLREQUEST, @"MAX CONTENT LENGTH EXCEEDED (%d) %@",
                      contentLength, _urlPath);
      [self cancel];
    }

    _responseData = [[NSMutableData alloc] initWithCapacity:contentLength];
  }
  else if ([response isKindOfClass:[NSURLResponse class]]) {
    _responseData = [[NSMutableData alloc] init];
  }
  else {
    [self cancel];
  }
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
  TTNetworkRequestStopped();

  if ([_response isKindOfClass:[NSHTTPURLResponse class]]) {
    TTDCONDITIONLOG(TTDFLAG_ETAGS, @"Response status code: %d", _response.statusCode);

    // We need to accept valid HTTP status codes, not only 200.
    if (_response.statusCode >= 200 && _response.statusCode < 300) {
      [_queue loader:self didLoadResponse:_response data:_responseData];
    } else if (_response.statusCode == 304) {
      [_queue loader:self didLoadUnmodifiedResponse:_response];
    } else {
      TTDCONDITIONLOG(TTDFLAG_URLREQUEST, @"  FAILED LOADING (%d) %@",
                      _response.statusCode, _urlPath);
      NSError* error = [NSError errorWithDomain:NSURLErrorDomain code:_response.statusCode
                                       userInfo:nil];
      [_queue loader:self didFailLoadWithError:error];
    }
  }
  else if ([_response isKindOfClass:[NSURLResponse class]]) {
    [_queue loader:self didLoadResponse:_response data:_responseData];
  }

  TT_RELEASE_SAFELY(_responseData);
  TT_RELEASE_SAFELY(_connection);
}

答案 1 :(得分:0)

在这里回答我自己的问题。

这种情况似乎很罕见(在我的具体情况下)。我解决它的方法是先检查img链接(可能是图像数据)是否有一个共同的图像文件类型扩展名(jpg,png,gif等等)。我只是在没有丢弃数据的情况下忽略它。

我不太了解Web标准以及将图像数据嵌入链接应该是否合适,但我现在知道它存在并且可能导致使用此类崩溃。希望这可以帮助任何有这个问题的人。