0

したがって、これはかなり奇妙な広告です。問題がAssetsLibrary APIにあるかどうかはわかりませんが、他に何が起こっているのか理解できません。

ALAssetsGroupで-enumerateAssetsUsingBlockメソッドを使用してALAssetsで配列をロードしています。完了したら、カスタム画像スクローラーを読み込んでいます。スクローラーがスクロールを終了したら、NSInvocationOperationsを使用して、ディスク上のフォトライブラリから現在表示されているビュー(ページ)の画像を読み込みます。画像が読み込まれてキャッシュされると、デリゲートに通知され、デリゲートはキャッシュから画像を取得して、スクローラーの画像ビューに表示します。

すべて正常に動作しますが、-setImage:が実際に呼び出されてから、実際に画面に表示されるまでにかかる時間は耐えられません。実際に表示されるまでに10秒以上かかることもあります。

画像のサイズ変更の有無にかかわらず試してみましたが、サイズ変更を行うと処理時間はほとんど増えません。私が言ったように、速度低下は、画像ビューで-setImageを呼び出した後のどこかにあります。これを引き起こす可能性のあるAssetLibraryAPIのある種の側面を知っている人はいますか?

関連するコードは次のとおりです。

- (void)setImagesForVisiblePages;
{
  for (MomentImageView *page in visiblePages)
  {
    int index = [page index];
    ALAsset *asset = [photos objectAtIndex:index];

    UIImage *image = [assetImagesDictionary objectForKey:[self idForAsset:asset]];

    // If the image has already been cached, load it into the
    // image view. Otherwise, request the image be loaded from disk.
    if (image)
    {
      [[page imageView] setImage:image];
    }
    else {
      [self requestLoadImageForAsset:asset];      
      [[page imageView] setImage:nil];
    }
  }  
}
4

1 に答える 1

0

これはおそらくAssetsLibraryの問題を解決しようとしているウェブ検索を台無しにするでしょう、それで私は謝罪します。問題はAssetsLibraryではなく、マルチスレッドの使用にあることがわかりました。画像の読み込みが完了すると、デフォルトのNSNotificationCenterを使用して通知を投稿していました。それはバックグラウンドスレッドに投稿され、その後、-setImageを使用してUIImageViewを更新していました(または少なくとも更新しようとしました)。-performSelectorOnMainThreadを使用するように変更し、そのセレクターに代わりに画像を設定させると、すべてうまくいきました。

マルチスレッドにどれほど慣れていても、時々小さな落とし穴を忘れてしまうことがあります。

于 2010-07-14T22:38:53.707 に答える