XML Parser Xcode действительно медленный - PullRequest
1 голос
/ 17 февраля 2012

Я занимаюсь разработкой приложения для iPhone, и у меня возникли проблемы с моим парсером xml.Я должен проверить несколько значений из нескольких файлов XML, но когда активен анализатор XML, я больше ничего не могу сделать.Это не так, как я хочу, потому что проверка xml должна выполняться в фоновом режиме, не будучи замеченным.Вот часть моего кода, надеюсь, этого достаточно!

appDelegate.datavalues = [[NSMutableArray alloc] init];
for(int i = 0; i < [headarray count]; i++){
    NSMutableArray *infoarray = [[NSMutableArray alloc]initWithArray:[headarray objectAtIndex:i]];
    NSString *IP = [infoarray objectAtIndex:1];
    NSString *Unique = [infoarray objectAtIndex:2];
    NSString *Port = [infoarray objectAtIndex:3];
    NSString *relay = (NSString *)[infoarray objectAtIndex:4];
    NSString *input = (NSString *)[infoarray objectAtIndex:5];
    NSLog(@"relay%@",relay);
    NSString *urlAddress = [NSString stringWithFormat:@"http://%@:%@/state.xml",IP,Port];
    NSURL *url = [NSURL URLWithString:urlAddress];
    NSString *authHeader = [NSString stringWithFormat:@"Basic %@",Unique];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval: 3];
    [request setValue:authHeader forHTTPHeaderField:@"Authorization"];
    //NSURLConnection *connectionResponse = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    NSURLResponse *myURLResponse;
    NSError *myError;

    NSData* myDataResult = [NSURLConnection sendSynchronousRequest: request returningResponse:&myURLResponse error:&myError];


    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:myDataResult];
    XMLParser *parser = [[XMLParser alloc] initXMLParser];
    //parser.relay = [infoarray objectAtIndex:4];
    //Set delegate
    [xmlParser setDelegate:parser];
    //Start parsing the XML file.
    BOOL success = [xmlParser parse];

после этого я проверяю некоторые значения, поэтому не думаю, что это необходимо показывать!

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Вы можете выполнить рефакторинг кода, связанного с XML, в отдельный метод, а затем использовать Grand Central Dispatch для запуска метода в фоновом режиме:

- (void) startOperation
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{
        [self runSomeXMLChecks];
        dispatch_sync(dispatch_get_main_queue(), ^{
            // This is dispatched on the main queue so that
            // you can update the UI. The NSLog is just an example.
            NSLog(@"XML check done!");
        });
    });
}
0 голосов
/ 17 февраля 2012

Посмотрите API-интерфейсы NSOperation и NSOperationQueue и / или Руководство по программированию параллелизма. (Оба находятся в библиотеке Xcode).

Из документов:

Класс NSOperationQueue регулирует выполнение набора NSOperation объекты. После добавления в очередь операция остается в этой очереди до тех пор, пока не будет явно отменено или завершено выполняя свою задачу. Операции в очереди (но пока нет выполняются в соответствии с приоритетами и взаимосвязи объекта взаимодействия и выполняются соответственно. приложение может создавать несколько очередей операций и отправлять операции любому из них.

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