IOS:我如何刷新与异步TBXML的用户界面
问题描述:
我正在使用TBXML来解析一个http-XML文件并显示在UILabel & UIImageView中的内容。 对XML的调用是通过异步请求完成的。IOS:我如何刷新与异步TBXML的用户界面
当我查看日志时,立即打印succesblock中的最后一个日志元素。几秒钟后才能看到UILabel的更改。
如何让IOS在完成处理XML后直接刷新UI?
// Create a success block to be called when the async request completes
TBXMLSuccessBlock successBlock = ^(TBXML *tbxmlDocument) {
// If TBXML found a root node, process element and iterate all children
NSLog(@"PROCESSING ASYNC CALLBACK");
if (tbxmlDocument.rootXMLElement)
[self traverseElement:tbxmlDocument.rootXMLElement];
myArticle.Body = [[StringCleaner sharedInstance] cleanedString:myArticle.Body];
// myArticle.Body = [myArticle.Body stringByConvertingHTMLToPlainText];
self.articleBody.text = myArticle.Body;
self.articleBody.numberOfLines= 0;
self.articleBody.lineBreakMode = UILineBreakModeWordWrap;
[self.articleBody sizeToFit];
// set scroll view size
self.articleBodyScrollView.contentSize = CGSizeMake(self.articleBodyScrollView.contentSize.width, self.articleBody.frame.size.height);
NSURL *url = [NSURL URLWithString:myArticle.Photo];
NSData *data = [NSData dataWithContentsOfURL:url];
if (data != NULL)
{
UIImage *image = [UIImage imageWithData:data];
// articlePhoto = [[UIImageView alloc] initWithImage:image];
[self.articlePhoto setImage:image];
}else {
NSLog(@"no data");
}
NSLog(@"FINISHED PROCESSING ASYNC");
// [self printArticles];
};
// Create a failure block that gets called if something goes wrong
TBXMLFailureBlock failureBlock = ^(TBXML *tbxmlDocument, NSError * error) {
NSLog(@"Error! %@ %@", [error localizedDescription], [error userInfo]);
};
// tbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:someXML]];
tbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:records]
success:successBlock
failure:failureBlock];
答
听起来像试图更新UI但不在UI线程上。将你的UILabel和UIImageView更新包装到主线程的dispatch_async中,例如:
dispatch_async(dispatch_get_main_queue(),^
{
[self.articlePhoto setImage:image];
});
你能解释一下吗?我在哪里添加dispatch_async代码?在TBXML的成功范围内? – user1194465