SDWebImageは配列の配列に変換された画像を用いてimageStr

コード

//封装
+ (void)fetchCacheImgs:(NSArray *)arrImgStr finishBlk:(void(^)(NSArray *arrImgs))finishBlk{
    NSMutableArray *arrMTemp = [NSMutableArray arrayWithArray:arrImgStr];
    __block NSInteger sum = 0;
    [arrImgStr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSString *strImg = obj;
        [[SDWebImageManager sharedManager] loadImageWithURL:[NSURL URLWithString:strImg] options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
            sum++;
            [arrMTemp replaceObjectAtIndex:idx withObject:image];
            if (sum == arrImgStr.count) {
                //结束
                if (finishBlk) {
                    finishBlk(arrMTemp);
                }
            }
        }];
    }];
}

//调用
[UIImage fetchCacheImgs:@[
                              @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558086203027&di=e27944d7d427004a71c2cdb0fbf58125&imgtype=0&src=http%3A%2F%2Fpic139.nipic.com%2Ffile%2F20170819%2F19317778_203257969000_2.jpg",
                              @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558086203027&di=83035960a9ac35ee59c90d277e29b484&imgtype=0&src=http%3A%2F%2Fs1.sinaimg.cn%2Fmw690%2F0021szcogy6VoIyTEw8d0%26690",
                              @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558086203027&di=5e307af14e64026034b3bf77ac423c21&imgtype=0&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2Fbf389549d64d6853870dbda4e811a0f56ca138aaa424-lj2LaA_fw658",
                              @"https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1792894298,856132472&fm=26&gp=0.jpg"
                              ] finishBlk:^(NSArray *arrImgs) {
                                  self.vm.arrMImgCountImg = [NSMutableArray arrayWithArray:arrImgs];
                              }];
复制代码

問題

答え

実際には、このブロックとの関係のメカニズム。ブロック外部の変数にアクセスするには、2つの方法があります。

一つは、渡された値が、別の転送のアドレスです。可変添加__block修飾子の前部は、それが配信アドレスとなります。あなたは、外部変数の値を変更することができるように、内部および外部のこの時間ブロックは、変数のアドレスを共有しました。

転送値もあります。値を保存するために、最終的な構造で、内部へのアクセスをブロックします外部変数送信ブロックの値です。

私たちは下に上記のコードを分析してみましょう
ブロック着信内部用構造が保存IDX = 0このとき0に、第一の外部アレイトラバーサル。その後、オープンマルチスレッド、次いで、IDX = 1スレッドを開く構造とパス1内のブロックを保存するには、この時間の後。最終配列トラバーサルが完了し、開いて複数のスレッドです。この時、画像データとデータのいくつかの大規模な、いくつかの少量。したがって、最初のオープンスレッドは、完全なデータを要求するために、必ずしもではありません。だからここでは、マルチスレッドのスケジューリング問題になります。

例えば、第二のオープンスレッド画像データが比較的小さい最初の要求が完了すると、IDX 1の値の前に渡され、この時間は役割を果たしてブロックを入力する最初は、行くために身体の内部構造にIDXブロックがかかります、値を取ることです渡された時間値は1です。我々は、実際の画像に画像の置換文字列を、対応する特性の可撓性アレイを使用することができます。

証明します

私たちは、forループを修正する__blockでループ変数のフロントを書き換えます。あなたは結果が変わるでしょう、私たちはそれを試してみるよ、それはサイトの転送になりましょう。

我々は再び__block修飾子の実行を取り除くために試すことができます。

これはまた、片手にブロックの特性、転写、転写サイトの価値を証明しています。

一方、それはまた、この点を説明することができる方法でコードを見ることで、CPPファイルを表示することができます。

概要

実際には、上記のコードは、画像データに変換する画像列を完了するための機能loadImageWithURL SDWebImageの使用です。ここでは、それがダウンロードして見つけることができない、直接バック後で検索し、キャッシュを見つけるために行くだろう。

占いのブロックプロパティにSDWebImage完全strImgイメージターンの使用から脱線。しかし、私はこの場所は私達の注意の価値があると思います。知識のポイントを見落とすことは容易です。

今日は主にブロックを使用することである考えます。私たちは、完了するために、可変ブロックアクセスの外部値の特性を活用する「スレッドの並べ替えを。」

ます。https://juejin.im/post/5cf0f34be51d45554877a578で再現

おすすめ

転載: blog.csdn.net/weixin_33943836/article/details/91465682