Как я могу сделать несколько вызовов initWithContentsOfURL без его возврата в конечном итоге неправильный материал?
Я делаю многоуровневый анализ веб-страниц, где я использую информацию с одной страницы для детализации и захвата "нижней" страницы для анализа. Когда я добираюсь до самого низкого уровня своей иерархии, я больше не захожу на новую страницу, я в основном нажимаю на ту же (с другими параметрами) и делаю записи базы данных 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 он может работать круглосуточно без проблем с утечкой памяти. Умирает только тогда, когда у меня проблема с подключением. Это до тех пор, пока я сплю (1) перед самым внутренним циклом.
Как будто это слишком быстро и initWithContentsOfURL не может идти в ногу. Я полагаю, я мог бы попытаться сделать что-то асинхронное, но это не для потребления пользователем, а прямая синхронная зацикливание работает просто отлично... почти. Я пробовал разные способы замедления. Работает пауза на одну секунду на регулярной основе, но если я уберу это, она начнет получать поддельные данные примерно через 10 раз через внутренний цикл. Есть ли способ справиться с этим правильно?
1 ответ
Я не думаю, что это проблема initWithContentsOfURL
; скорее, я подозреваю, что это сервер или сеть, которая не может ответить так быстро.
Следующее предполагает, что это так.
Если вы хотите получать сетевые ошибки и / или ошибки ответа сервера, вам нужно использовать NSURLConnection. Там нет никакого способа получить уведомление об ошибке от initWithContentsOfURL
, Если вы знаете, что такое страница-заглушка, или если вы знаете волшебную строку в успешном ответе, вы можете проверить возвращенную NSData
против тех.