1

NSURLSessionDownload タスクを使用して、UITableViewCells に画像をダウンロードしています。各セルには、画像ビューと関連するテキストが含まれています。

アプリは Web サービスと同期し、インターネット接続が利用できない場合に備えてデータを保持できる必要があります。そのため、Core Data を使用してテキスト情報を保存しており、画像はファイル システムに保存されています。約 10 KB のサイズで取得する必要があるほとんどの画像。画像は全部で20枚くらいです。ただし、イメージの 1 つは 6 MB です。

ここに私の問題があります: 10KB の画像をダウンロードするとき、アプリが使用するヒープ割り当ての永続的なバイトは約 8 MB です。6 MB のイメージがダウンロードされた後、永続的なバイト数が約 100 MB まで急増し、メモリ警告が表示され、アプリが終了することもあります。

これを修正する方法がわかりません。どんな援助も大歓迎です。ありがとう。

小さいサイズの画像をダウンロード中の Leaks Instrument のスクリーン ショット。

Leaks Instruments スクリーンショット 1

6 MB のイメージがダウンロードされた後の Leaks Instrument のスクリーン ショット。

Leaks Instruments スクリーンショット 2

テーブルビューのセルにデータを入力するために使用するコードは次のとおりです。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

  Person *person = [self.fetchedResultsController objectAtIndexPath:indexPath];
  cell.textLabel.text = person.alias;
  cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
  cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", person.status];

  // Determine the path to use to store the file
  NSString *imagePath = [[SyncEngine sharedEngine].imagesDirectory.path stringByAppendingFormat:@"/%@", person.alias];

  if ([[NSFileManager defaultManager] fileExistsAtPath:imagePath]) {
    cell.imageView.image = [UIImage imageWithContentsOfFile:imagePath];
  } else {
    cell.imageView.image = [UIImage imageNamed:@"image-placeholder"];
    NSURL *imageURL = [NSURL URLWithString:person.imageURL];
    NSURLSessionDownloadTask *imageDownloadTask = [[SyncEngine sharedEngine].session downloadTaskWithURL:imageURL completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {

  @autoreleasepool {
    NSData *imageData = [NSData dataWithContentsOfURL:location];
    NSLog(@"%@ original image size: %lu B", person.alias, (unsigned long)imageData.length);
    UIImage *image = [UIImage imageWithData:imageData];
    imageData = UIImageJPEGRepresentation(image, 0.2);
    NSLog(@"Compressed: %lu", (unsigned long)imageData.length);

    // Save the image to file system
    NSError *saveError = nil;
    BOOL saved = [imageData writeToFile:imagePath options:0 error:&saveError];
    if (saved) {
      NSLog(@"File saved");
    } else {
      NSLog(@"File not saved:\n%@, %@", saveError, saveError.userInfo);
    }

    dispatch_async(dispatch_get_main_queue(), ^{
      cell.imageView.image = [UIImage imageWithContentsOfFile:imagePath];
    });
  }
}];

    [imageDownloadTask resume];
  }
  return cell;
}
4

1 に答える 1

1

問題が解決しました。画像を圧縮してサイズを変更するだけでした。

于 2015-04-18T13:09:12.053 に答える