0

画像 (1.png、2.png、3.png、4.png、5.png) を循環し、それらを UIImageView に表示する関数を作成しました。アイデアは、私がウェブページをロードしていて、このイメージビューがこの関数を基本的にロードアイコンとして実行することです。ただし、イメージビューに関する限り、なぜ機能しないのかわかりません。何も表示されません。助けてください!私の関数のコードは以下の通りです。webviewデリゲートを含む他のすべてのテストが正常に機能するため、ここで行っていることは何か間違っていることを知っています。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    for(int c = 1; !webviewLoaded; c++)
    {
        c = c % 6;
        if(c == 6)
            c = 1;
        NSString *numberString = [NSString stringWithFormat:@"%d.png", c];
        UIImage *img = [UIImage imageNamed:numberString];
        [self.loadingImage setImage:img];
        sleep(1);
    }
});
4

1 に答える 1

0

バックグラウンド スレッドで UI 処理を行っているため、UI コンポーネントをバックグラウンド スレッドから変更しないでください。

次のようにコードを変更できます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  dispatch_async(dispatch_get_main_queue(), ^{
    for(int c = 1; !webviewLoaded; c++)
    {
        c = c % 6;
        if(c == 6)
            c = 1;
        NSString *numberString = [NSString stringWithFormat:@"%d.png", c];
        UIImage *img = [UIImage imageNamed:numberString];
        [self.loadingImage setImage:img];
        sleep(1);
    }
  }
});

このコードは機能しますが、役に立たず、期待するほど良い結果が得られません。これは、UI スレッドを呼び出すためだけに別のスレッド (操作) を作成しているためです。効率的ではありません。

あなたがすべきことは、次のようにディスパッチを完全に削除することです:

   for(int c = 1; !webviewLoaded; c++)
    {
            c = c % 6;
            if(c == 6)
                c = 1;
            NSString *numberString = [NSString stringWithFormat:@"%d.png", c];
            UIImage *img = [UIImage imageNamed:numberString];
            [self.loadingImage setImage:img];
            sleep(1);
    }

これも機能しますが、これらのファイルが@"%d.pngプロジェクトに追加されていることを確認してください。

そして、あなたはGCDここに慣れていないので、良いチュートリアルです

于 2013-06-19T20:44:48.813 に答える