Я пытаюсь использовать расширение 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 действительно владеют блоком, который я не понял?
Любые подсказки помогут, спасибо большое.
thx для ур ответ. Теперь я вижу, что это не удержание цикла. Но я не понимаю вашего значения ** опускания кода в блоке завершения. ** Вы имеете в виду отправку блока успеха nil или пустого блока успеха? Я смотрю на подкласс AFNetworking imageView (строка 152). Только если успех равен нулю, AFNetworking будет устанавливать для меня значение. Поэтому, если мое понимание правильное, я думаю, что мне все равно нужно вызвать setImage и setNeedsLayout в блоке успеха вручную. – Lyn
Не могли бы вы дать мне пример кода, как использовать mehod '[cell.imageView setImageWithURLRequest: placeholderImage success: failure:];' для получения изображений без предупреждения Xcode? – Lyn
@ Lyn, я думаю, что метод должен работать нормально с блоком завершения nil. (обратите внимание на 'if (success)' в строке 149 UIImageView + AFNetworking.m.Это не создает изображения в представлении изображения? Если нет, выполните блок отказов, чтобы узнать, можете ли вы получить подсказку о том, что происходит не так. – danh