NSScanner работает по WiFi, но не 3G
Я настроил NSScanner для работы на кране UIButton со следующим кодом:
-(IBAction)doLoadTTData
{
NSString *Period1String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period1String" ofType: @"txt"] usedEncoding:nil error:nil];
NSString *Period2String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period2String" ofType: @"txt"] usedEncoding:nil error:nil];
NSString *Period3String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period3String" ofType: @"txt"] usedEncoding:nil error:nil];
NSString *Period4String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period4String" ofType: @"txt"] usedEncoding:nil error:nil];
NSString *Period5String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"Period5String" ofType: @"txt"] usedEncoding:nil error:nil];
NSURL *currentURL = [NSURL URLWithString:webView.request.URL.absoluteString];
NSLog(@"Loaded Timetable");
NSError *loaderror;
NSString *page = [NSString stringWithContentsOfURL:currentURL
encoding:NSASCIIStringEncoding
error:&loaderror];
[webView loadHTMLString:page baseURL:currentURL];
NSString *Period1Data = nil;
NSScanner *htmlScanner = [NSScanner scannerWithString:page];
[htmlScanner scanUpToString:Period1String intoString:NULL];
[htmlScanner scanString:Period1String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period1Data];
NSLog(@"Collected Period 1 Data: %@", Period1Data);
if(Period1Data == NULL)
{
Period1Data = @"Not Available";
[period1label setText:@"Not Available"];
}
else if(Period1Data == @"(null)")
{
Period1Data = @"Not Available";
[period1label setText:@"Not Available"];
}
else
{
[period1label setText:Period1Data];
}
NSString *Period2Data = nil;
[htmlScanner scanUpToString:Period2String intoString:NULL];
[htmlScanner scanString:Period2String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period2Data];
if(Period2Data == NULL)
{
Period2Data = @"Not Available";
[period2label setText:@"Not Available"];
}
else if(Period2Data == @"(null)")
{
Period2Data = @"Not Available";
[period2label setText:@"Not Available"];
}
else
{
[period2label setText:Period2Data];
[period2label setText:@"Not Available"];
}
NSLog(@"Collected Period 2 Data: %@", Period2Data);
NSString *Period3Data = nil;
[htmlScanner scanUpToString:Period3String intoString:NULL];
[htmlScanner scanString:Period3String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period3Data];
if(Period3Data == NULL)
{
Period3Data = @"Not Available";
[period3label setText:@"Not Available"];
}
else if(Period3Data == @"(null)")
{
Period3Data = @"Not Available";
[period3label setText:@"Not Available"];
}
else
{
[period3label setText:Period3Data];
}
NSLog(@"Collected Period 3 Data: %@", Period3Data);
NSString *Period4Data = nil;
[htmlScanner scanUpToString:Period4String intoString:NULL];
[htmlScanner scanString:Period4String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period4Data];
if(Period4Data == NULL)
{
Period4Data = @"Not Available";
[period4label setText:@"Not Available"];
}
else if(Period4Data == @"(null)")
{
Period4Data = @"Not Available";
[period4label setText:@"Not Available"];
}
else
{
[period4label setText:Period4Data];
}
NSLog(@"Collected Period 4 Data: %@", Period4Data);
NSString *Period5Data = nil;
[htmlScanner scanUpToString:Period5String intoString:NULL];
[htmlScanner scanString:Period5String intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&Period5Data];
if(Period5Data == NULL)
{
Period5Data = @"Not Available";
[period5label setText:@"Not Available"];
}
else if(Period5Data == @"(null)")
{
Period5Data = @"Not Available";
[period5label setText:@"Not Available"];
}
else
{
[period5label setText:Period5Data];
}
NSLog(@"Collected Period 5 Data: %@", Period5Data);
NSString* TimetableDate = nil;
NSString *DateString = [NSString stringWithFormat:@"<FONT size=2> <STRONG><FONT size=3>"];
[htmlScanner scanUpToString:DateString intoString:NULL];
[htmlScanner scanString:DateString intoString:NULL];
[htmlScanner scanUpToString:@"</FONT>" intoString:&TimetableDate];
NSString *timetablefulldate = [NSString stringWithFormat:@"Timetable for %@", TimetableDate];
[timetabledate setText:timetablefulldate];
[TimetableLoading setHidden:YES];
[TimetableLoadingBG setHidden:YES];
if(Period1Data == NULL && Period2Data == NULL && Period3Data == NULL && Period4Data == NULL && Period5Data == NULL)
{
if(ttbacking.tag == 10)
{
NSLog(@"Already showing message");
}
else
{
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Timetable"
message:@"Looks like you don't have any lessons today! Maybe you'd like to get some homework out of the way?"
delegate:nil
cancelButtonTitle:@"I'll have a think"
otherButtonTitles:nil];
[message show];
[ttbacking setTag:10];
}
[period1label setText:@"Free Time"];
[period2label setText:@"Free Time"];
[period3label setText:@"Free Time"];
[period4label setText:@"Free Time"];
[period5label setText:@"Free Time"];
period1backing.image = [UIImage imageNamed:@"redperiodbacking.png"];
period2backing.image = [UIImage imageNamed:@"redperiodbacking.png"];
period3backing.image = [UIImage imageNamed:@"redperiodbacking.png"];
period4backing.image = [UIImage imageNamed:@"redperiodbacking.png"];
period5backing.image = [UIImage imageNamed:@"redperiodbacking.png"];
}
if(TimetableDate == NULL)
{
[timetabledate setText:@"No timetable today"];
}
[prevDay setHidden:NO];
[nextDay setHidden:NO];
NSLog(@"Student Timetable collected and published");
}
К сожалению, это работает только с WiFi, а не 3G.
Если я нажимаю кнопку на соединении 3G, все метки показывают "Недоступно", потому что результаты "NULL". Это странно, потому что я поставил UIWebView перед всем одним разом, чтобы проверить, действительно ли страница загружена и работает, как если бы она была в WiFi. По какой-то причине NSScanner не работает на 3G.
Почему это может быть? Просто скажите, есть ли другой код, который вам нужно посмотреть...
1 ответ
У меня есть пара вещей, чтобы сказать. Во-первых, то, что вы делаете со сканерами и прочим, действительно довольно хакерское. Если вы пытаетесь разобрать HTML, вы должны делать это правильно. Используйте что-то вроде libxml2
(который встроен в iPhone), чтобы на самом деле разобрать HTML и получить что-то от него. Честно говоря, ваша система может сломаться с небольшим обновлением или сбоем в работе страницы.
Достаточно разглагольствования, но если вы решите оставить свою текущую систему на месте, вы можете попытаться получить реальный HTML-код со страницы, загруженной в данный момент.
Например (как я уже писал в вашем другом вопросе):
NSString *path = @"document.body.innerHTML";
NSString *html = [webView stringByEvaluatingJavaScriptFromString:path];
Поскольку ваше веб-представление может загружаться, вы должны иметь возможность получить содержимое из загруженного веб-представления следующим образом.
И если я могу добавить, это не сработает: else if(Period1Data == @"(null)")
, Отладчик печатает (null)
, но если строка является нулевой, она никогда не будет отображаться как (нулевая). И если бы вы сравнивали строки, вы бы делали isEqualToString:
, но я убегаю с собой.;)