0

私はWebページの複数レベルの解析を行っており、1つのページの情報を使用してドリルダウンし、「下の」ページを取得して解析します。階層の最下位レベルに到達すると、新しいページにアクセスすることはなくなり、基本的に同じページ(異なるパラメーターを使用)にアクセスしてSQLデータベースエントリを作成します。

その内側のループの前に(sleep(1)を置くことによって)速度を落とさない場合、initWithContentsOfURLは最終的に一種のHTMLのスタブ部分を返します。HTMLノードを取得するために使用するコードは次のとおりです。

    NSError *err = nil;
    NSString* webStringURL = [sURL stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    NSData *contentData = [[[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: webStringURL] 
                                                         options: 0 
                                                           error: &err] autorelease];   
    NSString *dataString = [[[NSString alloc] initWithData: contentData
                                                  encoding: NSISOLatin1StringEncoding] autorelease];    
    NSData *data = [dataString dataUsingEncoding: NSUTF8StringEncoding];
    TFHpple *xPathDoc = [[[TFHpple alloc] initWithHTMLData: data] autorelease]; 

4レベルのループで正常に動作します。ファックスでは、実際のメモリリークの問題なしに24時間年中無休で実行できます。接続に問題がある場合にのみ死にます。これは、最も内側のループの前にsleep(1)を入れている限りです。

速すぎてinitWithContentsOfURLが追いつかないようです。非同期で何かをしようと試みることはできると思いますが、これはユーザー消費用ではなく、直接同期ループは問題なく機能します...ほとんど。私は物事を遅くするさまざまな方法を試しました。定期的に1秒間一時停止することはできますが、それを取り除くと、内部ループを約10回通過した後に偽のデータを取得し始めます。これを適切に処理する方法はありますか?

4

1 に答える 1

1

私はそれが問題だとは思わないinitWithContentsOfURL; むしろ、それを迅速に応答できないのはサーバーまたはネットワークだと思います。

以下はその場合を想定しています。

ネットワークエラーやサーバー応答エラーを受信する場合は、NSURLConnectionを使用する必要があります。からエラーについて通知を受け取る方法はありませんinitWithContentsOfURL。スタブページが何であるかを知っている場合、または成功した応答でマジックストリングを知っている場合は、NSDataそれらに対して返されたものを確認できます。

于 2010-10-06T01:40:49.500 に答える