Как я могу отключить кнопку во время работы NSXMLParser, а затем включить ее после завершения? - PullRequest
0 голосов
/ 17 февраля 2010

У меня есть viewController, который импортирует XMLParser.h как класс xmlParser

Я передаю объект NSURL в моем viewController классу xmlParser с методом getXML ниже

goButton - это кнопка, которую я нажимаю, чтобы вызвать метод getXML ниже. Я отключаю кнопку, которую нажал, чтобы вызвать метод getXML, но я не уверен, куда поместить код, чтобы включить его снова, когда xmlParser закончит анализ возвращаемого XML.

- (IBAction) getXML {
    goButton.enabled = NO;

    // allocate and initialize the xmlParser 
    xmlParser = [[XMLParser alloc] init];

// then generate the URL we are going to pass to it and call the fetchXML method passing the URL.
    NSURL *xmlurl = [[NSURL alloc] initWithString:@"http://www.mysite.com/myfile.xml"];
    [xmlParser fetchXMLFromURL:xmlurl];

    // release objects
    [xmlurl release];
    [xmlParser release];

}

Согласно рекомендации @Squeegy, я изменил свой код.

- (IBAction) getXML {
    goButton.enabled = NO;

    xmlParser = [[XMLParser alloc] init];

    [self performSelectorInBackground:@selector(parseInBackground:) withObject:xmlParser];

}

- (void)parseInBackground:(XMLParser*)parser {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSURL *xmlurl = [[NSURL alloc] initWithString:@"http://www.mysite.com/myfile.xml"];

    [parser fetchXMLFromURL:xmlurl];
    [self performSelectorOnMainThread:@selector(didFinishXMLParsing:) withObject:parser];

    [xmlurl release];
    [pool drain];

}

- (void)didFinishXMLParsing:(NSXMLParser*)parser {
    goButton.enabled = YES;
}

Работает, пока не доберется до линии

[self performSelectorOnMainThread:@selector(didFinishXMLParsing:) withObject:parser];

Компилятор жалуется следующим образом:

2010-02-17 00:22:20.574 XMLApp[2443:521b] *** -[viewController performSelectorOnMainThread:withObject:]: unrecognized selector sent to instance 0x1285a0
2010-02-17 00:22:20.578 XMLApp[2443:521b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[viewController performSelectorOnMainThread:withObject:]: unrecognized selector sent to instance 0x1285a0'
2010-02-17 00:22:20.583 XMLApp[2443:521b] Stack: (
    861696817,
    860329709,
    861700631,
    861203093,
    861166272,
    18715,
    846004025,
    845672609,
    848189713
)

Ответы [ 2 ]

1 голос
/ 17 февраля 2010
- (IBAction)getXML {
    goButton.enabled = NO;

    xmlParser = [[XMLParser alloc] init];
    NSURL *xmlurl = [[NSURL alloc] initWithString:@"http://www.mysite.com/myfile.xml"];
    [xmlParser fetchXMLFromURL:xmlurl];

    [self performSelectorInBackground:@selector(parseInBackground) withObject:xmlParser];

    [xmlurl release];
    [xmlParser release];
}

- (void)parseInBackground:(NSXMLParser*)parser {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [parser parse];
    [self performSelectorOnMainThread:@selector(didFinishXMLParsing:)
                           withObject:parser
                        waitUntilDone:NO];

    [pool drain];
}

- (void)didFinishXMLParsing:(NSXMLParser*)parser {
    goButton.enabled = YES;
}

Хитрость заключается в том, чтобы выполнять обработку в фоновом потоке, что позволяет пользовательскому интерфейсу делать вещи. Когда синтаксический анализ завершен, вы должны внести любые изменения пользовательского интерфейса обратно в основной поток.

0 голосов
/ 17 февраля 2010

Когда парсер завершит разбор, он вызовет делегат:

- (void)parserDidEndDocument:(NSXMLParser *)parser

В этом методе вы можете снова включить кнопку. Вероятно, вам следует сделать это с помощью вызова performSelectorInMainThread, так как это включает изменение представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...