Three20 - TTStyledTextLabel, сталкивающийся с данными изображения base64 вместо URL - Сбои - PullRequest
0 голосов
/ 21 марта 2011

Я использую TTStyledTextLabel с данными TTStyledText из XHTML для отображения статьи новостей.Он работает нормально, за исключением того, что с ссылкой на данные вместо ссылки, в этом случае происходит сбой!

Код

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 ]

2 голосов
/ 21 ноября 2011

Проблема в том, что Three20 TTRequestLoader использует NSHTTPURLResponse вместо NSURLResponse в методах NSURLConnectionDataDelegate. 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);
}
0 голосов
/ 31 марта 2011

Собираюсь ответить на мой собственный вопрос здесь.

Кажется, что это редкий случай (в моей конкретной ситуации). Я решил это, выполнив проверку заранее, чтобы увидеть, имеет ли ссылка img (которая может быть данными изображения) общее расширение типа файла изображения (jpg, png, gif и т. Д ....). Я просто игнорирую это в случае, если это не так, и отбрасываю данные.

Я не очень разбираюсь в веб-стандартах и ​​в том, считается ли нормальным встраивать данные изображений в те места, где должны быть ссылки, но теперь я знаю, что они существуют и могут вызвать сбой при использовании этого класса. Надеюсь, что это может помочь любому, кто имеет эту проблему.

...