我正在使用TBXML创建一个XML解析器类。我希望这个类可以加载一个XML文档,遍历它,并返回一个字符串数组以填充表格。这应该在后台线程中进行,以避免阻塞UI。我想添加一个完成块,以便在XML解析完成时设置表格的数据源数组。
如何实现完成块?以下是我的一些代码:
Parser.m
如何实现完成块?以下是我的一些代码:
Parser.m
- (NSMutableArray *)loadObjects
{
// Create a success block to be called when the asyn request completes
TBXMLSuccessBlock successBlock = ^(TBXML *tbxmlDocument) {
NSLog(@"PROCESSING ASYNC CALLBACK");
// If TBXML found a root node, process element and iterate all children
if (tbxmlDocument.rootXMLElement)
[self traverseElement:tbxmlDocument.rootXMLElement];
};
// Create a failure block that gets called if something goes wrong
TBXMLFailureBlock failureBlock = ^(TBXML *tbxmlDocument, NSError * error) {
NSLog(@"Error! %@ %@", [error localizedDescription], [error userInfo]);
};
// Initialize TBXML with the URL of an XML doc. TBXML asynchronously loads and parses the file.
tbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:@"XML_DOC_URL"]
success:successBlock
failure:failureBlock];
return self.array;
}
- (void)traverseElement:(TBXMLElement *)element
{
do {
// if the element has child elements, process them
if (element->firstChild) [self traverseElement:element->firstChild];
if ([[TBXML elementName:element] isEqualToString:@"item"]) {
TBXMLElement *title = [TBXML childElementNamed:@"title" parentElement:element];
NSString *titleString = [TBXML textForElement:title];
[self.array addObject:titleString];
};
// Obtain next sibling element
} while ((element = element->nextSibling));
}
TableViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
Parser *parser = [[Parser alloc] init];
self.products = [parser loadObjects];
}
self.products = self.parser.array
属性而不是返回的数组。2)在self.tableview reloadData
和cellForRow...
之间我得到了一些非常奇怪的延迟。这导致我的表格在parserDidFinishLoading被调用后15秒左右才更新。 - mnort9reloadData
。我不得不将reloadData
替换为[[self tableView] performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
。 - mnort9self.products = self.parser.array
是否可以? - mnort9self.parser.array
调用array
的 getter 并返回一个指针。self.products =
使用该指针作为参数调用products
的 setter。 - ilmiacsperformSelectorOnMainThread:
,例如使用delegate
的parserDidFinishLoading
。这样,切换线程的责任就只属于Parser
对象本身。ViewController不应该知道其他线程的存在。 - ilmiacs