1

あらかじめ決められた Web サイトのリストを開き、それぞれの読み込みにかかった経過時間を記録する iOS 用の一種の診断アプリを作成しています。アプリで ViewController 内の UIWebView を開きます。

ViewController ソースの重要な部分は次のとおりです。

- (void)viewDidLoad {
    [super viewDidLoad];
    DataClass *obj = [DataClass getInstance];
    obj.startOfTest = [NSDate date];

    //load the first webpage
    NSString *urlString = [websites objectAtIndex:obj.counter];  //assume firstWebsite is already instantiated and counter is initially set to zero
    obj.counter = obj.counter + 1;
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [obj.websiteStartTimes addObject:[NSDate date]];
    [webView loadRequest:request];
}

- (void)webViewDidFinishLoading:(UIWebView *)localWebView{
    DataClass *obj = [DataClass getInstance]; //gets 'global' variables

    if(!webView.loading){ 
        NSString *urlString = [websites objectAt:obj.counter];
        obj.counter = obj.counter + 1;
        NSURL *url = [NSURL URLWithString:urlString];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [obj.websiteStartTimes addObject:[NSDate date]];
        [webView loadRequest:request];
    }

このコードの問題は、完了する前の Web サイトよりも先に次の Web サイトをロードするように見えることです。webViewDidFinishLoading への呼び出しとその中の if ステートメントの両方が、Web サイトが確実に実行されると考えていましたが、そうではありません。1 つの Web サイトで didFinishLoading メソッドが複数回呼び出されることがありますが、if ステートメントは 1 回しか入力されません。

たとえば、10 個の Web サイトのリストがある場合、webView は実際にはリストの 3 番目と 6 番目の Web サイトのみを表示し、それらすべてのレンダリングが「完了」したことを示します。

アプリが次のページに移動する前に、Web サイトの読み込みが完全に完了し、画面にレンダリングされるようにするには、他に何ができますか?

4

0 に答える 0