0

さて、NSXMLParsing を実行するときにいくつかの問題が発生しています。パーサーは個別に正常に動作していますが、バックグラウンドで非同期に実行しようとすると、ドキュメントの解析が完了したことを示すパーサーは 1 つだけです。

私の完全なプロセスを説明するには、次のようにします

  1. ユーザーインターフェイスをブロックしないように、バックグラウンドで複数の NSURLConnections と NSURLRequests を使用して 2 つの Web ページを読み込みます
  2. 次に、そのデータを取得して xml パーサーに渡します。
  3. Web ページごとに個別の XML パーサーがあり、それぞれに独自の参照とメモリが割り当てられています。
  4. 次に、通常どおりパーサーを実行します。パーサーは、私が示す特定のタグを探します。yadda yadda、すべて正常に機能しています。
  5. 問題は、パーサーが終了したことを示すときに発生します。parserDidEndDocument:(NSXMLParser *)parserメソッドを使用して、ドキュメントが終了したかどうかを確認します。残念ながら、このメソッドは 1 回しか呼び出されないため、両方のパーサーが完了したかどうかはわかりません。

私のコードはこれです:

接続が完了すると

-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
    if (connection == actConnection) {
        [self processSynopsis]; // initiate synopsis parser
    } else if (connection == castConnection) {
        [self processCast]; // initiate cast parser
    }
}

シノプシス パーサーの割り当てと開始

-(void) processSynopsis {
    actParser = [[NSXMLParser alloc] initWithData:actData];
    [actParser setDelegate:self];
    [actParser parse];
}

キャスト パーサーの割り当てと開始

-(void) processCast {
    castParser = [[NSXMLParser alloc] initWithData:castData];
    [castParser setDelegate:self];
    [castParser parse];
}

パーサーが終了したかどうかの確認

-(void) parserDidEndDocument:(NSXMLParser *)parser {

    if (parser == actParser) {
        NSLog(@"ended act %@",parser);
    } else if (parser == castParser) {
        NSLog(@"ended cast %@",parser);
    }
}

このparserDidEndDocumentメソッドは、何らかの理由で 1 回だけ呼び出されます。誰もが何か間違ったことを見たり、以前にこの問題を抱えていたりします. 事前に助けてくれてありがとう!

4

1 に答える 1

0

NSLog は、実際のロギング作業を行う NSLogv の単純なフロント エンドです。ドキュメントによると:

NSLogv からの出力は、プロセス内の 1 つのスレッドのみが一度に上記の書き込み/ログ記録を実行できるという点で、シリアル化されます。次のスレッドが試行を開始する前に、メッセージの書き込み/ログ記録のすべての試行が完了します。

「始められます」の解釈の仕方がわかりません。これは、NSLogv の実行中に何かを記録しようとしても無視されることを意味する可能性があります。したがって、最初のパーサーの直後に 2 番目のパーサーが終了した場合、ログ メッセージは送信されません。

@synchronized() ディレクティブを試して、2 つのスレッドが互いに干渉しないようにしてください。このようなもの:

-(void) parserDidEndDocument:(NSXMLParser *)parser {
    @syncronized(self) {
        if (parser == actParser) {
            NSLog(@"ended act %@",parser);
        } else if (parser == castParser) {
           NSLog(@"ended cast %@",parser);
        }
    }
}
于 2012-08-28T21:18:22.557 に答える