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]; 
}); 
+0

你能解释一下吗?我在哪里添加dispatch_async代码?在TBXML的成功范围内? – user1194465