dispatch_async с парсером xml не работает

я использую dispatch_async при анализе данных xml в удобном представлении, вот мой код:

- (void) Parse{
    dispatch_async( dispatch_get_global_queue(0, 0), ^{
     NSString *post =[[NSString alloc] initWithFormat:@"http://messages.xml"];
     NSData *xmlData=[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:post]];
     xmlParserObject =[[NSXMLParser alloc]initWithData:xmlData];
     [xmlParserObject setDelegate:self];
     dispatch_async( dispatch_get_main_queue(), ^{
     [xmlParserObject parse];
     });
     });
    [messageList reloadData];
}

теперь uitableview не показывает в нем никаких данных. он отлично работал до dispatch_async


person Vix Hunk    schedule 29.04.2016    source источник
comment
Вы вызываете [messageList reloadData] не после получения данных, это происходит сразу после первой отправки. Помните, что при диспетчеризации выполнение кода в основном потоке немедленно продолжается со следующего оператора, которым является reloadData.   -  person dirkgroten    schedule 29.04.2016


Ответы (1)


Я думаю, что у вас есть проблема в вашем коде. Пожалуйста, перезагрузите данные таблицы в dispatch_get_main_queue()

- (void) Parse {
    dispatch_async( dispatch_get_global_queue(0, 0), ^{

        NSString *post =[[NSString alloc] initWithFormat:@"http://messages.xml"];
        NSData *xmlData=[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:post]];
        xmlParserObject =[[NSXMLParser alloc]initWithData:xmlData];
        [xmlParserObject setDelegate:self];
        [xmlParserObject parse];
        dispatch_async( dispatch_get_main_queue(), ^{
            [messageList reloadData];
        });
    });    
}
person Hitesh Surani    schedule 29.04.2016
comment
Зачем выполнять синтаксический анализ xml в основном потоке? Я бы переместил строку [xmlParserObject parse]; над вызовом `dispatch_async(dispatch_get_main_queue()'), чтобы он работал в фоновом режиме. В основном потоке нужно выполнить только вызов reloadData. - person Duncan C; 29.04.2016
comment
помещает только код перезагрузки в dispatch_get_main_queue() и другой код, где вы хотите, не вызывает проблем - person Hitesh Surani; 29.04.2016
comment
помещает только код перезагрузки в dispatch_get_main_queue(), а другой код, где вы хотите, не вызывает проблем. Хм? Это не приговор. Помещение кода синтаксического анализа XML в основной поток приведет к зависанию пользовательского интерфейса во время синтаксического анализа XML. Если размер XML велик, это может привести к очень длительному зависанию пользовательского интерфейса и даже к тому, что система уничтожит ваше приложение как не отвечающее на запросы. имеет значение. - person Duncan C; 29.04.2016