gpt4 book ai didi

ios - 在 objective-c 中解析 xml 时更改 View

转载 作者:行者123 更新时间:2023-11-29 13:10:55 26 4
gpt4 key购买 nike

我在主线程上更改 UIView 时遇到一些问题。

我想在我的 View 中显示 xml 解析百分比。在解析时,它将值初始化为 mylabel.text 并在控制台中显示,但不在 View 中显示。解析完成后,它会在我的标签中显示解析的最后一个值。

我知道这是主队列正在使用xml解析的主线程问题。如何停止xml解析并使uilabel在主线程中显示百分比?或者显示 xml 解析百分比的任何想法?我正在使用委托(delegate)方法来显示解析过程。这是我的代码:

//在viewcontroller.h

      #import "TheParser.h"

@interface ViewController : UIViewController <TheParserProtocol> {
BOOL YN;
}
...

}

//viewcontroller.m

  - (IBAction)updatePage:(id)sender {

NSString *path = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"files.xml"];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data ];
TheParser *theParser = [[TheParser alloc] initParser];
[xmlParser setDelegate:theParser ];
theParser.delegate = self;
[xmlParser parse];


}

-(void) sendmes:(NSString *)str{
UrlText.text=[NSString stringWithFormat: @"Hi ,%@",str];
NSLog(@" UrlText.text is %@", UrlText.text);
}

//我的解析器类

//在 TheParser.h 我的协议(protocol)中

   @protocol TheParserProtocol 

-(void) sendmes : (NSString *) str;

@end

//在TheParser.m

  -(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

if ([elementName isEqualToString: @"files"]) {
app.ListArray = [[NSMutableArray alloc] init];
}
else if ([elementName isEqualToString:@"file"]){
theList = [[List alloc]init];
int idValue = [[attributeDict objectForKey:@"id"] intValue];
[_delegate sendmes:[NSString stringWithFormat:@"%i",idValue]];

....

}

我已经检查过了

   [_delegate performSelectorOnMainThread:@selector(sendmes:) withObject: [NSString    stringWithFormat:@"Last %i",i] waitUntilDone:NO];

  dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"works");
[_delegate sendmes:[NSString stringWithFormat:@"%i",i]];

});

没有一个对我有用。

有人可以帮忙吗?

提前谢谢

最佳答案

目前,您尝试进行的解析和所有 UI 更新都在主线程上进行,因此解析会阻止 UI 更新。您目前尝试过的解决方案导致许多 UI 更新在主线程上排队等待解析完成。然后这些更新都处理得太快而无法显示在屏幕上。

与其试图让一切都在主线程上工作(如果不对解析器进行重大且无意义的更改是不可能的),您应该在后台线程上运行解析并将 UI 更新发送回主线程。你已经有了一半的代码。您只需要将解析包装在一个 block 中并在后台运行它。

需要明确的是,您无法从后台线程更新 UI,因此您需要将 UI 更新推送回主线程。


似乎还有另一个问题,这就是为什么我认为有这么多困惑的原因......

您正在创建 theParser 来充当您的解析器的委托(delegate),但它从未被保留。假设您正在使用 ARC,它几乎会立即被释放,因此不会将任何委托(delegate)消息转发到您的 View Controller 。

关于ios - 在 objective-c 中解析 xml 时更改 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17398783/

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