Я пытаюсь запустить фоновый поток для извлечения данных 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:@""];
}