我正在尝试启动后台线程以从 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”方法进行分配吗?这似乎太低效了。
解析内容响应
-(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:@""];
}