Как я могу сделать несколько вызовов initWithContentsOfURL, чтобы он не возвращал неправильные данные? - PullRequest
0 голосов
/ 05 октября 2010

Я выполняю несколько уровней парсинга веб-страниц, где я использую информацию с одной страницы для детализации и захвата «нижней» страницы для анализа.Когда я достигаю самого низкого уровня своей иерархии, я больше не захожу на новую страницу, я в основном нажимаю на ту же (с другими параметрами) и делаю записи базы данных SQL.

Если я не замедляю работу(помещая sleep (1)) перед этим внутренним циклом, initWithContentsOfURL в конечном итоге возвращает своего рода заглушку HTML.Вот код, который я использую для получения моих узлов HTML:

    NSError *err = nil;
    NSString* webStringURL = [sURL stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    NSData *contentData = [[[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: webStringURL] 
                                                         options: 0 
                                                           error: &err] autorelease];   
    NSString *dataString = [[[NSString alloc] initWithData: contentData
                                                  encoding: NSISOLatin1StringEncoding] autorelease];    
    NSData *data = [dataString dataUsingEncoding: NSUTF8StringEncoding];
    TFHpple *xPathDoc = [[[TFHpple alloc] initWithHTMLData: data] autorelease]; 

Он отлично работает с 4 уровнями зацикливания.В faxt он может работать круглосуточно без проблем с утечкой памяти.Умирает только тогда, когда у меня проблема с подключением.Это до тех пор, пока я вставляю sleep (1) перед самым внутренним циклом.

Как будто это слишком быстро и initWithContentsOfURL не может идти в ногу.Я полагаю, я мог бы попытаться сделать что-то асинхронное, но это не для потребления пользователем, а прямая синхронная зацикленность работает просто отлично ... почтиЯ пробовал разные способы замедления.Работает пауза на одну секунду на регулярной основе, но если я уберу это, она начнет получать поддельные данные примерно через 10 раз через внутренний цикл.Есть ли способ справиться с этим правильно?

1 Ответ

1 голос
/ 06 октября 2010

Не думаю, что это проблема initWithContentsOfURL;скорее, я подозреваю, что это сервер или сеть, которая не может ответить так быстро.

Следующее предполагает, что это так.

Если вы хотите получать сетевые ошибки и / или ошибки ответа сервера, вам нужно использовать NSURLConnection .Нет способа получить уведомление об ошибке от initWithContentsOfURL.Если вы знаете, что такое страница-заглушка, или если вы знаете магическую строку в успешном ответе, вы можете проверить возвращенные значения NSData по этим.

...