バックグラウンド スレッドを起動して、Web サービスから XML データを取得しようとしています。スレッドなしで同期的に開発したので、その部分が機能することはわかっています。これで、スレッドを生成して応答と解析を待機することにより、ノンブロッキング サービスを利用する準備が整いました。
スレッド内に NSAutoreleasePool を作成し、解析の最後に解放しました。スポーンするコードとスレッドは次のとおりです。
メインループ コードからスポーンします。
.
.
[NSThread detachNewThreadSelector:@selector(spawnRequestThread:)
toTarget:self withObject:url];
.
.
スレッド (「自己」内) :
-(void) spawnRequestThread: (NSURL*) url {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[self parseContentsOfResponse];
[parser release];
[pool release];
}
このメソッドparseContentsOfResponse
は、NSMutableDictionary に解析されたドキュメント コンテンツを入力します。データを頻繁に移動することを避け、コピーを作成するのではなく、スレッドを生成したメインループにデータを割り当て直したいと考えています。まず、それは可能ですか?そうでない場合は、メインスレッドから割り当てられたポインターを渡し、「dictionaryWithDictionary」メソッドで割り当てることができますか? それはとても非効率的なようです。
parseContentsOfResponse
-(void)parseContentsOfResponse {
[parser setDelegate:self];
[parser setShouldProcessNamespaces:YES];
[parser setShouldReportNamespacePrefixes:YES];
[parser parse];
NSError *parseError = [parser parserError];
if (parseError) {
NSLog(@"%@", parseError);
NSLog(@"publicID: %@", [parser publicID]);
NSLog(@"systemID: %@", [parser systemID]);
NSLog(@"line:%d column:%d", [parser lineNumber], [parser columnNumber]);
}
ready = YES;
}
最初の解析セクション
各セクションは、その elementStart が通知されると、要素文字列を作成します。elementEnd は、オブジェクトを辞書に追加し、要素を解放します。残りの詳細は冗長です。注意すべき点は、割り当てが NSZone に向けられていないため、スレッドのメモリ プールに存在する必要があることです。
- (void)parserDidStartDocument:(NSXMLParser *)parser {
NSLog(@"%s", __FUNCTION__);
currentChars = [NSMutableString stringWithString:@""];
elementQuestion = [NSMutableString stringWithString:@""];
elementAnswer = [NSMutableString stringWithString:@""];
elementKeyword = [NSMutableString stringWithString:@""];
}