iOS SDWebImageソースコード研究(二)

2559 ワード

1.前編では、SDImageCacheがディスクキャッシュのキーとして完全なURLを使用していると述べています.しかし、アクセス制御の目的でURLの一部がダイナミックになる場合があり、ディスクキャッシュが機能しないことがあります.
この問題について、SDWebImageManagerは、SDImageCacheを単独で使用することはなく、ソースコードを自分で変更する必要があるという解決策を示しています.cacheKeyFilterを設定し、NSURLを入力としてNSStringをキャッシュキーとして出力します.
SDWebImage GitHubホームページのコード例を次に示します.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
        url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
        return [url absoluteString];
    };

    // Your app init code...
    return YES;
}

2.今日面接に行った時、cleanDiskWithCompletionBlock:でNSdirectoryEnumeratorを使う性能について質問されました.NSdirectoryEnumeratorを使用してすべてのキャッシュ・ファイルを巡回すると、パフォーマンスに問題が発生するかどうか、改善する必要はありません.
stackoverflowを問い合わせると、NSdirectoryEnumeratorを使用してすべてのキャッシュ・ファイルを巡り、必要なファイル・サイズ情報などのファイル・プロパティを取得すると、パフォーマンスに問題はありません.NSdirectoryEnumeratorがファイルのプロパティを取得するには、ファイルのinodeデータを表示することで、想像していたfileopenやfilecloseは必要ありません.
inodeに含まれるUNIXユーザーがよく使用する重要な情報:
  • inode番号
  • ファイルの種類、およびstat C関数を識別するためのモード情報
  • .
  • ファイルのリンク樹木
  • 属主のUID
  • 属主のグループID(GID)
  • ファイルのサイズ
  • ファイルで使用するディスクブロックの実際の数
  • 最近の修正時間
  • 最近のアクセス時間
  • 最近の変更時間
  • 3.SDWebImageでNSCacheを直接使用しない理由について、サブクラスAutoPurgeCacheをカスタマイズする必要があります.
    この問題を説明する前に、NSCacheを使うメリットを見てみましょう.
    NSCacheのメリット:
  • 自動削減機能
  • スレッドセキュリティ
  • は健
  • をコピーしません.
    これは,NSDictionary自身がキャッシュを実装することなく,集合のようなNSCacheを選択した理由である.
    しかし、このstackoverflowの問題により、NSCacheはiOS 7システムではメモリアラートに応答しないため、SDWebImageではNSCacheをサブクラス化し、自分でメモリアラートを傍受し、removeAllObjects.