gpt4 book ai didi

objective-c - 带有完成 block 的自定义 xml 解析器类

转载 作者:数据小太阳 更新时间:2023-10-29 02:36:30 25 4
gpt4 key购买 nike

我正在使用 TBXML 创建一个 xml 解析器类。我希望类加载一个 xml 文档,遍历它,并返回一个字符串数组来填充一个表。这应该在后台线程中进行,因此它会阻塞 UI。我想添加一个完成 block ,以便在 xml 解析完成时设置表的数据源数组。

如何实现完成 block ?这是我到目前为止所拥有的:

解析器.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];
}

最佳答案

像这样,你会得到一个空数组,对吧?那是因为 loadObjects 没有阻塞并在它完成任务之前就返回了。

现在,您希望您的 viewDidLoad 立即返回,以便您的表格可以显示。因此,在您的 TableViewController 中,您需要一个回调,在显示空表后调用该回调并管理更新。标准技术是使用委托(delegate)。在 Parser.h 中定义

@protocol ParserProtocol <NSObject>
-(void)parserDidFinishLoading;
@end

在解析器界面添加

@property id<ParserProtocol> delegate;

使用以下行完成您的successBlock

[self.delegate parserDidFinishLoading];

然后使 TableViewController 符合 ParserProtocol 并将 Parser 添加为属性:

@property Parser* parser;

在TableViewController.m中替换

Parser *parser = [[Parser alloc] init];
self.products = [parser loadObjects];

self.parser = [[Parser alloc] init];
self.products = [self.parser loadObjects];

并添加

-(void)parserDidFinishLoading{
[self.tableView reloadData];
}

self.products 指向Parser 现在修改的array 属性。因此不需要额外的设置。

祝你好运,彼得。

关于objective-c - 带有完成 block 的自定义 xml 解析器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com