2016-05-31 2 views
2

Я пытаюсь использовать расширение UIImageView AFNetworking2.6.3 для получения изображений с удаленного сервера. все работает нормально, изображения возвращаются и успешно отображаются. но я получаю сохранить предупреждение цикла в Xcode7.3.1: захватывая «клетка» сильно в этом блоке, вероятно, приведет к удержанию циклуНет цикла сохранения, но почему все еще есть предупреждение о сохранении цикла?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    if(self.dataSourceModel) { 
     Model *model = self.dataSourceModel.items[indexPath.row]; 
     NSURL *url = [NSURL URLWithString:model.imageURL]; 
     NSURLRequest *theRequest = [NSURLRequest requestWithURL:url]; 
     UIImage *placeholderImage = [UIImage imageNamed:@"placeholder"]; 

     //I don't use __weak cell in the block 
     [cell.imageView setImageWithURLRequest:theRequest placeholderImage:placeholderImage success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) { 
      cell.imageView.image = image; //get warning at this line 
      [cell setNeedsLayout]; 
     } failure:nil]; 
    } 
    return cell; 
} 

я могу видеть, так как, например клетки были захвачен в блоке , поэтому блок имеет право владения экземпляром ячейки (и cell.imageView). если цикл сохранения действительно существует, ячейка или изображениеView должны иметь право собственности на блок.

, но я рассмотрел исходный код UIImageView+AFNetworking.h и UIImageView+AFNetworking.m, UIImageView не имеет никакого свойства блоков. блок является просто параметром метода, а не переменной экземпляра. UITableViewCell также не имеет права собственности на блоки.

Я даже использовал утечки, чтобы проверить, и утечки не сообщили о какой-либо ошибке.

Итак, я считаю, что здесь нет цикла удержания, но почему я все еще получаю предупреждение Xcode здесь? Если я использую __weak cell __weak UITableViewCell *weakCell = cell;, предупреждение исчезнет. Но я все еще хочу знать:

  • У этого есть цикл удержания здесь?
  • действительно ли мне нужно использовать __weak?
  • или, может быть, изображениеView или cell действительно владеют блоком, который я не понял?

Любые подсказки помогут, спасибо большое.

ответ

1

Существует, конечно, цикл удержания, и вы можете избежать предупреждения, опуская код в блоке завершения. Взглянув на подкласс AFNetworking imageView (строка 152), кульминационной точкой setImage... является установка образа изображения изображения. Вам нужно, чтобы ваш код снова установил его или изменил состояние макета.

Также не должно быть необходимости в if (self.dataSourceModel). Если источник данных построен правильно, мы ответили на количество строк в tableView:numberOfRowsInSection:, и этот ответ равен нулю, когда модель пуста, избегая общего вызова cellForRow....

+0

thx для ур ответ. Теперь я вижу, что это не удержание цикла. Но я не понимаю вашего значения ** опускания кода в блоке завершения. ** Вы имеете в виду отправку блока успеха nil или пустого блока успеха? Я смотрю на подкласс AFNetworking imageView (строка 152). Только если успех равен нулю, AFNetworking будет устанавливать для меня значение. Поэтому, если мое понимание правильное, я думаю, что мне все равно нужно вызвать setImage и setNeedsLayout в блоке успеха вручную. – Lyn

+0

Не могли бы вы дать мне пример кода, как использовать mehod '[cell.imageView setImageWithURLRequest: placeholderImage success: failure:];' для получения изображений без предупреждения Xcode? – Lyn

+0

@ Lyn, я думаю, что метод должен работать нормально с блоком завершения nil. (обратите внимание на 'if (success)' в строке 149 UIImageView + AFNetworking.m.Это не создает изображения в представлении изображения? Если нет, выполните блок отказов, чтобы узнать, можете ли вы получить подсказку о том, что происходит не так. – danh

Смежные вопросы