0

RSSフィードからロードされたテーブルビューを表示しているiPhoneアプリがあります。ビューが読み込まれたら、このメソッドを呼び出して新しい NSThread で実行します。

- (void)start:(NSURL*)url {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSXMLParser *XMLParser = [[[NSXMLParser alloc] initWithContentsOfURL:url] autorelease];
    [XMLParser setDelegate:self];

    if (items) {
        [items release];
    }
    items = [[NSMutableArray alloc] init];

    [self startParsing:XMLParser];

    [pool drain];
}

正常に動作していますが、xml のダウンロードまたは解析中にユーザーがビューを離れた場合、スレッドの実行を停止したいのですが、メモリ リークなしで実行を停止するにはどうすればよいでしょうか? また、停止したいときに -initWithContentsOfURL: メソッドを実行している場合、そのメソッドを停止するにはどうすればよいですか?

4

3 に答える 3

3

接続を制御する必要があると予想される場合(つまり、ユーザーがキャンセルまたは移動した場合に接続を停止する場合)NSURLConnection、XMLを解析する前に、非同期APIを使用してデータをロードする必要があります。必要に応じて接続を閉じる機能を提供するだけでなく、ネットワークエラーへの対応も向上します。

cancelNSDが指摘したように、XML解析スレッドを駆動するクラスに何らかのメソッドを実装する必要がありperformSelector:onThread:withObject:waitUntilDone:ます。ユーザーがダウンロードをキャンセルしたり離れたりしたときに、メインスレッドから(または同様の)メソッドを使用するだけです。

于 2009-12-23T02:32:09.333 に答える
1

これらはスレッド停止オプションです

http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSThread_Class/Reference/Reference.html#//apple_ref/doc/uid/20000311-DontLinkElementID_12

そして、ガイドの他の場所から

「操作の途中でスレッドを終了する必要があると予想される場合は、キャンセルまたは終了メッセージに応答するように最初からスレッドを設計する必要があります。」

于 2009-12-23T02:22:57.170 に答える
0

NSOperationおそらく、 andNSOperationQueueクラスを調べる必要があります。

これらのクラスを使用すると、同時実行性と非同期実行を大幅に制御できます。

基本的な考え方は、キューを作成し、NSOperation をサブクラス化することです。サブクラスのメイン メソッド内で、作業の骨子を実行します。この場合、開始メソッドをここに配置できます。

次に、操作を簡単に制御し、同時に実行できる操作の数を設定し、一部の操作が他の操作に依存する可能性を設定できます。操作を簡単にキャンセルすることもできます。これは、ここでやりたいことです。

NSOperationおよびNSOperationQueueのドキュメントを確認してください。

于 2009-12-23T03:00:52.970 に答える