1

ロードとイメージの 2 つのメソッドを含むシリアル キューがあり、完了したらイメージをサブビューに追加します。画像は NSMutableArray にあるため、次のように For ループを繰り返して読み込みます。

dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL); 
for (int i =0; i<=[pictureThumbnailArray count]-1; i++) {
    dispatch_async(queue, ^{

    NSLog(@"Thumbnail count is %d", [pictureThumbnailArray count]);

        finishedImage = [self setImage:[pictureThumbnailArray objectAtIndex:i]:i];

        if (finishedImage !=nil) {
        dispatch_async(dispatch_get_main_queue(), ^ {
        [self.view addSubview:finishedImage];
    });

        }
    });
                   }

問題は、画像がランダムに読み込まれるように見えることです。私が達成したいのは、For ループの各反復が実行され、次の反復が開始される前に完了することです。そのようにして、毎回同じ方法で画像をロードする必要があります。

これを達成するための最良の方法を提案できる人はいますか? setImage メソッド (キューの最初のメソッド) を同期する必要があるのではないかと考えています。

に変更:

for (int i =0; i<=[pictureThumbnailArray count]-1; i++) {

    NSLog(@"Thumbnail count is %d", [pictureThumbnailArray count]);

        finishedImage = [self setImage:[pictureThumbnailArray objectAtIndex:i]:i];

        if (finishedImage !=nil) {
        dispatch_async(dispatch_get_main_queue(), ^ {
        [self.view addSubview:finishedImage];
    });

        }
                   }
    });
4

2 に答える 2

0

他にも問題があります。おそらく、画像配列があなたが思っている順序になっていません。queue と mainQueue はどちらもシリアル キューです。これを確認するために、簡単なテストを行い、予想どおりの順序でログ メッセージを取得しました。ログメッセージなどを追加して、順序が期待どおりでない理由を突き止めることをお勧めします。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

static dispatch_queue_t queue;
    queue = dispatch_queue_create("com.example.MyQueue", NULL);

    for (int i =0; i<=20; i++) {
        dispatch_async(queue, ^{
            dispatch_async(dispatch_get_main_queue(), ^ {
                NSLog(@"Image %d", i);
            });
        } );
    }
}
于 2013-04-11T19:28:01.070 に答える
0

GCD を使わずに物事をもっと単純にするとどうなるでしょうか? それを取り除き、NSURLConnectionDelegate メソッドを使用することをお勧めします。

このメソッドは次のイメージをダウンロードします。

-(void)startDownload
{
    if (index < URLs.count)
    {
        NSURL *URL = [NSURL URLWithString:URLs[index]];
        _connection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:URL] delegate:self];
    }
}

connectionDidFinishLoading:デリゲート メソッドは、画像をビューに配置し、次のダウンロードを開始します。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    UIImage *image = [UIImage imageWithData:_data];
    _data = nil;
    _connection = nil;
    UIImageView *imageView = (UIImageView *)[self.view viewWithTag:100+index];
    imageView.image = image;
    index++;
    [self startDownload];
}

完全な例は次のとおりです: https://github.com/obrizan/TestImageDownload画像はかなり大きいので、読み込むのに時間がかかります。

于 2013-04-11T21:44:14.400 に答える