0

メインのView ControllerでWebから画像を取得するために非同期タスクを使用しています。ユーザーがテーブル ビューの任意のセルをクリックすると、非同期タスクを一時停止して別のビューに移動したいのですが、どうすればよいですか? また、ユーザーがメイン ビューに戻ったときにタスクを続行する必要があります。マイコード

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
            UIImage *imagefromWeb = [UIImage imageWithData:[NSData dataWithContentsOfURL:[IconArray objectAtIndex:indexPath.row]]];
            CGSize newSize= CGSizeMake(45.0,45.0);
            UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
            [imagefromWeb drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
            UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();

            dispatch_async(dispatch_get_main_queue(), ^{
                cell.imageView.image=newImage;
                [cell setNeedsLayout];
                MAKE_IMAGE_CURVED(cell.imageView)
            });



        });
4

1 に答える 1

2

これには2つの合理的なアプローチがあります。1つは、一時停止を発生させたいときに設定されるフラグを設定することです。バックグラウンドキューのブロックは、実行する前にこのフラグをチェックし、設定されている場合は、設定が解除されるのを待つ必要があります。フラグは、セマフォとして作成するのが最適です。

ただし、GCDはキューの一時停止をサポートしています。バックグラウンドリクエストをカスタムキューに配置する場合(作成に使用dispatch_queue_create)、キューで使用dispatch_suspendして、それ以上のブロックが実行されないようにすることができます。dispatch_resumeもう一度行く準備ができたら電話してください。これにより、現在実行中のブロックの完了が妨げられることはなく、将来のブロックのみが完了します。すでにフローの途中にあるブロックの実行を停止するために私が考えることができる賢明な方法はありません。

セマフォとキュー管理の両方をカバーするGCDドキュメントについては、ここを参照してください

于 2012-12-31T11:58:28.867 に答える