あらかじめ決められた 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 サイトの読み込みが完全に完了し、画面にレンダリングされるようにするには、他に何ができますか?