1

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

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

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

//在viewcontroller.h中

      #import "TheParser.h"

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

   }

//视图控制器.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 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]];

                });

没有一个对我有用。

有人可以帮忙吗?

提前致谢

4

1 回答 1

1

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

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

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


似乎还有另一个问题,这就是为什么我认为会有如此多的混乱......

您正在创建theParser以充当解析器的委托,但它从未保留。假设您使用的是 ARC,它几乎会立即发布,因此任何委托消息都不会转发到您的视图控制器。

于 2013-07-01T07:12:43.520 回答