0

画像をロードするために Dispatch Queue を使用していますが、ある時点ですべての画像をロードしたくない場合にキューを停止する方法がわかりません。

- (void) loadImageInBackgroundArr1:(NSMutableArray *)urlAndTagReference {
    myQueue1 = dispatch_queue_create("com.razeware.imagegrabber.bgqueue", NULL);        
    for (int seriesCount = 0; seriesCount <[seriesIDArr count]; seriesCount++) {
        for (int i = 0; i < [urlAndTagReference count]; i++) {
            dispatch_async(myQueue1, ^(void) {
                NSData *data0 = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:[urlAndTagReference objectAtIndex:i]]];
                UIImage *image = [[UIImage alloc]initWithData:data0];
                dispatch_sync(dispatch_get_main_queue(), ^(void) {

                for (UIView * view in [OD_ImagesScrollView subviews]) {

                    if ([view isKindOfClass:[UIView class]]) {

                        for (id btn in [view subviews]) {
                            if ([btn isKindOfClass:[UIButton class]]) {

                                                   UIButton *imagesBtn = (UIButton *)btn;
                        for (UIActivityIndicatorView *view in [imagesBtn subviews]) {
                            if ([view isKindOfClass:[UIActivityIndicatorView class]]) {
                                if (imagesBtn.tag == seriesCount*100+100+i) {
                                    if (view.tag == seriesCount*100+100+i) {
                                        [imagesBtn setImage:image forState:UIControlStateNormal];
                                        [view stopAnimating];
                                        [view removeFromSuperview];
                                        view = nil;
                                        imagesBtn = nil;
                                    }
                                }
                            }
                        }
                      }
                     }
                   }
                }  

            });

            [image release];
            image = nil;
           [data0 release];
            data0 = nil;
        });

    }
}

}
4

1 に答える 1

7

ディスパッチ キューはキャンセルをサポートしていません。2 つの明白なオプション:

  1. 独自のキャンセル フラグをインスタンス変数として保持し、ブロックが作業を進める前にフラグをチェックするようにします。すべてのブロックは最終的に実行されますが、キャンセル フラグを設定した後に実行されたブロックはすぐに戻ります。

  2. NSOperationQueueディスパッチ キュー の代わりに を使用します。操作キューはキャンセルをサポートしています。実行を開始する前に操作をキャンセルすると、操作はまったく実行されません。操作が既に実行されている場合、中断されることはありませんが、isCancelledフラグをチェックして早期に戻るようにすることができます。

于 2012-11-23T07:11:10.283 に答える