1

アプリでdispatch_asyncを使用してGoogle API呼び出しを行い、解析しているJSON結果を取得しています。解析した JSON 応答からの結果の数に応じて更新されるように、進行状況ビューを実装したいと考えています。

したがって、私のdispatch_async Google API呼び出しは次のとおりです。

dispatch_async(myQueue, ^{

    NSData* data1 = [NSData dataWithContentsOfURL:googleURL];
    [self performSelectorOnMainThread:@selector(fetchResultsForGoogle:) withObject:data1 waitUntilDone:YES];
});

私のfetchResultsForGoogle: withObject:メソッドは結果を解析し、処理された結果の数とともに進行状況ビューを画面に表示したいと考えています。したがって、fetchResultsForGoogle...メソッド内で、次のものが必要です。

float percentage = (float)counter/(float)totalItems;
        self.progressView.progress = percentage;
        NSString *percentText = [NSString stringWithFormat:@"%f %% %@", percentage, @" complete"];
        self.progressViewLabel.text = percentText;

しかし、dispatch_async が別のスレッドで実行されている場合、を使用せずにメイン スレッドのビューを更新できないことを理解していると思いますdispatch_async(dispatch_get_main_queue()。これを解決するために、これを実装する 2 つの方法 (以下を参照) を試しましたが、どちらの方法もうまくいきません (progressViewまったくprogressViewLabel更新されません)。

プランA:

dispatch_async(myQueue, ^{

        NSData* data1 = [NSData dataWithContentsOfURL:googleURL];
        [self performSelectorOnMainThread:@selector(fetchResultsForGoogle:) withObject:data1 waitUntilDone:YES];

dispatch_async(dispatch_get_main_queue(), ^{

            float percentage = (float)counter/(float)totalItems;
            self.progressView.progress = percentage;
            NSString *percentText = [NSString stringWithFormat:@"%f %% %@", percentage, @"complete"];
            NSLog(@"Percentage: %@", percentText);
            self.progressViewLabel.text = percentText;
        });

    });

次の手段:

dispatch_async(myQueue, ^{

            NSData* data1 = [NSData dataWithContentsOfURL:googleURL];
            [self performSelectorOnMainThread:@selector(fetchResultsForGoogle:) withObject:data1 waitUntilDone:YES];

        });

そしてfetchResultsForGoogle...メソッド内:

dispatch_async(dispatch_get_main_queue(), ^{

                float percentage = (float)counter/(float)totalItems;
                self.progressView.progress = percentage;
                NSString *percentText = [NSString stringWithFormat:@"%f %% %@", percentage, @"complete"];
                NSLog(@"Percentage: %@", percentText);
                self.progressViewLabel.text = percentText;
            });

したがって、これを実装する正しい方法に関するアイデアやヒントは大歓迎です!

EDIT-SOLVED IT 修正しました。ブロックではdispatch_async、 に渡していましたperformSelectorOnMainThread。そのため、 で進行状況ビューを更新しようとしたときに完了performSelectorOnMainThreadするまで UI が更新されませんdispatch_async

そのため、ブロックperformSelectorInBackgroundThread内に変更したところ、UI が適切に更新されるようになりました。dispatch_asyncperformSelectorOnMainThread

私はこれらすべてに慣れていませんが、まだ新しいことを学んでいることをうれしく思います。

4

1 に答える 1

0

あなたがやっているようにメインスレッドで物事を更新することはできません。次のように、メインスレッドでセレクターを実行する必要があります。

パーセンテージがどこで変化するか正確にはわかりませんが、その下に行を追加してください。そして、メインスレッドでラベルとprogressViewを更新します

 [self performSelectorOnMainThread:@selector(updateProgress:) withObject:[NSNumber numberWithFloat:percentage] waitUntilDone:NO];


-(void) updateProgress:(NSNumber *) num {
        float percentage = [num floatValue];
        self.progressView.progress = percentage;
        NSString *percentText = [NSString stringWithFormat:@"%f %% %@", percentage, @" complete"];
        self.progressViewLabel.text = percentText;
 }
于 2012-08-05T18:02:19.643 に答える